不,这不是你应该如何去做。
当使用startActivityForResult()
时,被调用的活动(在您的示例中为B)必须使用:setResult()
之前finish()
。这是它给一个结果给呼叫活动的方式。
从活动B没有必要打电话给getIntent()
除非你需要一些参数或检查您是否已经呼吁的结果。
让我们做出了榜样:FriendsActivity
是指管理好友的活动,它通常显示当前好友列表,并允许添加更多。
从一些地方您的应用程序需要用户选择了一些行动朋友,让你有一个按钮:选择朋友,它打开FriendsActivity
与ACTION_PICK
和startActivityForResult()
。
所有的,看起来像这样:
Intent pickFriendIntent = new Intent(this, FriendsActivity.class);
pickFriendIntent.setAction(Intent.ACTION_PICK);
startActivityForResult(pickFriendIntent, REQUEST_PICK_FRIEND);
的REQUEST_PICK_FRIEND
是在调用活动定义的常量int
(有用的,如果你有更多然后用结果一个类型的请求)。
从FriendsActivity
:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// boolean flag to know if we are requested to pick or not
mPickMode = getIntent() != null && Intent.ACTION_PICK.equals(getIntent().getAction());
// etc...
}
的标志,让我们修改我们的活动的行为来接一个朋友。
例如点击一个朋友的时候,而不是去他的个人资料(或任何行动之前使用),我们应该回到朋友的信息和完成活动:
public void onFriendClicked(Friend theFriend) {
if (mPickMode) {
Intent resultData = new Intent();
// assuming Friend is Parcelable, if not just pass an ID or something
// it's usually best to handle this with a custom Uri actually
resultData.putExtra("friendParcelable", theFriend);
// here we set the result for the calling activity
setResult(RESULT_FRIEND_PICKED, resultData);
// and then we finish this one
finish();
} else { ... }
}
的RESULT_FRIEND_PICKED
是int
不断,通常是公开的。它告诉父母活动发生了哪种结果,你可以有更多的结果,满足你的需要。在上面的例子中,为公共常量创建额外值也是一个好主意,例如"friendParcelable"
。
当FriendsActivity
完成呼叫者获取回调:
protected void onActivityResult (int requestCode,
int resultCode,
Intent data) {
if (requestCode == REQUEST_PICK_FRIEND) {
if (resultCode == FriendsActivity.RESULT_FRIEND_PICKED) {
Friend pickedFriend = data.getParcelableExtra("friendParcelable");
// do whatever you want with that information
} else if (resultCode == Activity.RESULT_CANCELED) {
// the FriendsActivity terminated without calling setResult();
}
}
}
另外请注意,它不是强制性的setResult()
后立即打电话给finish()
。如果您致电setResult()
,然后让用户点击它,它仍然会提供结果。但是,如果在致电setResult()
之后活动被破坏并重新创建(例如设备旋转),则必须再次致电setResult()
。
谢谢弗拉维奥 - 我想我只是不明白为什么活动B必须获得意图,但随后什么都不做,并创建一个新的? – javapalava
我想,我不太确定使用请求代码的位置...... – javapalava
Intent不仅仅保存共享信息。它拥有让系统知道什么是目标活动的内容。得到一个空的意图是很好的。您可能不需要从中读取任何信息,但系统必须解决您所调用的活动。 –