問題の概要: ActivityA が ActivityB を で開始しstartActivityForResult
ます。ActivityB は を使用して結果を設定し、setResult
ActivityC を で開始しstartActivity
ます。singleTop
その後、 ActivityC はCLEAR_TOP
フラグを設定して ActivityA を開始します。これで ActivityB が終了し、ActivityA のonActivityResult
メソッドが呼び出されることを期待しています。残念ながら、このメソッドは ActivityA の再起動時に呼び出されません。
ActivityA コードstartActivityForResult()
: ActivityAの次のコードを使用して、アクティビティ (ActivityB) を開始しました。
....
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);
}
doSomethingSpecial()
ActivityA の関数が呼び出されることを期待していますが、これは発生していません。
注意: 余談ですが、ActivityB コードが置き換えられ、ダイアログから ActivityC を開始する代わりに、finish() が呼び出されます。つまり、ActivityC は開かれず、B は単に閉じられ、doSomethingSpecial()
実際に呼び出されます。したがって、この問題は、バック スタックとクリア トップの機能を理解していないことが原因のようです。
これが意図したとおりに動作しない理由について、何か支援をいただければ幸いです。私はこれに関して多くのハックを考え出しましたが、アクティビティ スタックの理解を深めるために、なぜこれが発生しているのかについて最も興味があります。