不,這不是你應該如何去做。
當使用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不僅僅保存共享信息。它擁有讓系統知道什麼是目標活動的內容。得到一個空的意圖是很好的。您可能不需要從中讀取任何信息,但系統必須解決您所調用的活動。 –