問題概述:ActivityA以startActivityForResult
開始ActivityB。 ActivityB使用setResult
設置其結果,然後使用startActivity
啓動ActivityC。 ActivityC然後啓動singleTop
ActivityA並設置了CLEAR_TOP
標誌。我期望完成ActivityB並調用ActivityA的onActivityResult
方法。不幸的是,這個方法在ActivityA重啓時沒有被調用。活動由clearTop完成時,SetResult不起作用
ActivityA代碼:我曾與startActivityForResult()
開始一個活動(ActivityB)用下面的代碼從ActivityA:
....
final Intent intent = new Intent(this, ActivityB.class);
startActivityForResult(intent, 0);
....
在ActivityA下面的代碼等待結果:
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == ACTIVITY_RESULT){
doSomethingSpecial();
}
}
ActivityB代碼:我有一個確認對話框。當用戶點擊「是」,他們會將該活動的結果,這
private void showConfirmationDialog(String message, final String username) {
AlertDialog.Builder alert = new AlertDialog.Builder(this)
.setMessage(message)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Intent intent = new Intent(this, ActivityC.class);
setResult(ActivityA.ACTIVITY_RESULT);
startActivity(intent);
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
alert.show();
}
ActivityC代碼:準備就緒後,下面的代碼是在點擊一個按鈕在ActivityC叫:
private void startActivityA(){
Intent intent = new Intent(this, ActivityA.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
}
我期待ActivityA中的doSomethingSpecial()
函數被調用,但這不會發生。就像旁白一樣,如果替換ActivityB代碼,而不是從對話框中啓動ActivityC,finish()就會被調用 - 即。 ActivityC永遠不會打開,而B只是簡單的關閉,然後doSomethingSpecial()
的確被調用。因此,這個問題似乎源於對後端堆棧和清除頂端的功能缺乏瞭解。
任何援助將不勝感激,爲什麼這不表現如願!我已經提出了許多黑客攻擊,但我最感興趣的是爲什麼會發生這種情況,以便提高我對活動堆棧的理解。
我正在從代碼的角度來討論。對於用戶來說,它確實想回去,但ActivityB是用戶不希望返回的中間活動。我認爲用clear_top標誌設置活動的目的正是爲了做到這一點:回到之前的活動並清除之後發生的所有活動 –
我不確定爲什麼您期望A的onActivityResult是當你從活動開始時調用它。在任何情況下,如果你按自己的方式設置,就可以用另一種方式來完成。從B→C然後從C→A傳遞你想要的結果。 – dmon
OK這就是我所缺少的。我期待在C中用'CLEAR_TOP'重新打開A並因此關閉B而調用A中的'onActivityResult',但似乎這個重新打開將不會**調用onActivityResult方法,因爲這個方法只有在返回時才被調用從B到A.我預計這會被調用,因爲我並沒有真正把這看作是關閉兩個後續活動然後重新打開,但我想它仍然是重新啓動activityA。 –