2

问题概述:ActivityA 以 ActivityB 启动startActivityForResult。ActivityB 使用 设置其结果setResult,然后使用 启动 ActivityC startActivity。ActivityC 然后启动singleTopActivityA 并设置CLEAR_TOP标志。我希望这可以完成 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()确实会被调用。所以这个问题似乎源于对back stack和clear top的功能缺乏了解。

任何帮助将不胜感激,为什么这不符合预期!我对此提出了一些技巧,但我最感兴趣的是为什么会发生这种情况,以提高我对活动堆栈的理解。

4

1 回答 1

2

我认为,从用户的角度来看,您从后来的活动(C)“开始”前一个活动(A),而不是仅仅“回到”它,这会感觉很奇怪。

我相信你应该从 B 开始 C 与startActivityWithResult(). 然后当活动 C 完成时调用finish()。在 B 的onActivityResult()电话中setResult(),然后finish()

于 2012-08-26T04:24:21.587 回答