2012-08-25 25 views
2

問題概述: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()的確被調用。因此,這個問題似乎源於對後端堆棧和清除頂端的功能缺乏瞭解。

任何援助將不勝感激,爲什麼這不表現如願!我已經提出了許多黑客攻擊,但我最感興趣的是爲什麼會發生這種情況,以便提高我對活動堆棧的理解。

回答

2

我認爲,從用戶的角度來看,你會覺得很奇怪,你是從以後的活動(C)開始一個以前的活動(A),而不是僅僅「回到」它。

我相信你應該從B開始C與startActivityWithResult()。然後當活動C完成後,致電finish()。在B的onActivityResult()請致電setResult(),然後finish()

+0

我正在從代碼的角度來討論。對於用戶來說,它確實想回去,但ActivityB是用戶不希望返回的中間活動。我認爲用clear_top標誌設置活動的目的正是爲了做到這一點:回到之前的活動並清除之後發生的所有活動 –

+0

我不確定爲什麼您期望A的onActivityResult是當你從活動開始時調用它。在任何情況下,如果你按自己的方式設置,就可以用另一種方式來完成。從B→C然後從C→A傳遞你想要的結果。 – dmon

+0

OK這就是我所缺少的。我期待在C中用'CLEAR_TOP'重新打開A並因此關閉B而調用A中的'onActivityResult',但似乎這個重新打開將不會**調用onActivityResult方法,因爲這個方法只有在返回時才被調用從B到A.我預計這會被調用,因爲我並沒有真正把這看作是關閉兩個後續活動然後重新打開,但我想它仍然是重新啓動activityA。 –