2

問題の概要: ActivityA が ActivityB を で開始しstartActivityForResultます。ActivityB は を使用して結果を設定し、setResultActivityC を で開始し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()実際に呼び出されます。したがって、この問題は、バック スタックとクリア トップの機能を理解していないことが原因のようです。

これが意図したとおりに動作しない理由について、何か支援をいただければ幸いです。私はこれに関して多くのハックを考え出しましたが、アクティビティ スタックの理解を深めるために、なぜこれが発生しているのかについて最も興味があります。

4

1 に答える 1

2

ユーザーの観点からすると、単に「戻る」のではなく、後のアクティビティ (C) から前のアクティビティ (A) を「開始」することは非常に奇妙に感じると思います。

で B から C を開始する必要があると思いますstartActivityWithResult()。次に、アクティビティ C が終了したら、 を呼び出しますfinish()。B のonActivityResult()コールsetResult()で、次にfinish().

于 2012-08-26T04:24:21.587 に答える