0

我有三个活动A,B和C。

A 以 BstartActivityForResult(getIntent(), ACTIVITY_B);开头,B 以 开头startActivityForResult(getIntent(), ACTIVITY_C);C。ACTIVITY_B并且ACTIVITY_C是跨活动具有相同值的常数。

当 C 以 RESULT_OK 返回时,B 将使用以下代码重新启动:

if (resultCode == Activity.RESULT_OK){
    finish();
    startActivityForResult(getIntent(), ACTIVITY_B);
}

这工作正常。

当 B 必须返回时(单击菜单项),它会设置活动结果。

public boolean onMenuItemSelected(int featureId, MenuItem item) {
    switch(item.getItemId()) {
        case MENU_CONFIRM:
            System.out.println("Setting Result to RESULT_OK");
            setResult(Activity.RESULT_OK);
            finish();
            return true;
    }
    return super.onMenuItemSelected(featureId, item);
}

但是我可以看到它setResult(Activity.RESULT_OK);被忽略了,因为它总是像RESULT_CANCEL在活动 A(onActivityResult)中一样被接收。我正在使用 2.3。

有什么线索吗?

4

2 回答 2

0

不要完成B并开始一个新的,A不会收到通知,因为它不是它打开的B。相反,如果 C 在结束时需要向 B 返回某些内容,请创建一个 Intent,将结果值放在其上,然后在 B 中检查此结果:

C:

Intent data = new Intent();
// Store values you want to return on the intent
setResult(RESULT_OK, data);
finish();

B:在 onActivityResult

if (resultCode == Activity.RESULT_OK) {
  // get values from the intent and change B accordingly
}
于 2012-06-15T05:36:28.437 回答
0

我很好奇你是如何处理你的意图和活动生命周期的。

根据我在您的两篇文章中所读到的内容:

  • A 使用 startActivityForResult() 启动 B。
  • B 用 startActivityForResult() 启动 C。
  • C 完成它的任务,调用 setResult() 和 finish()。

现在,除非我遗漏了什么,否则活动 B 使用以下代码:

if (resultCode == Activity.RESULT_OK){
    finish();
    startActivityForResult(getIntent(), ACTIVITY_B);
}

开始自己?你能澄清一下吗?

添加

我相信您是从 B 开始的,因此当您在 B 的第二个实例中调用 setResult() 和 finish() 时,您将返回到第一个 B 活动。

如果您没有使用任何特殊的 Intent 标志,则生命周期将是:

  • A 开始 B
    • B 开始 C
      • C完成
    • B自动恢复,B结束
  • A 自动恢复。

据我了解,您已将该周期更改为:

  • A 开始 B

    • B 开始 C
      • C完成
    • B 自动恢复,onActivityResult() 开始第二个 B
      • 第二个 B 完成,(但是您希望接下来会看到 A...)
    • B 自动恢复(如果您再次调用 finish(),此时您应该会看到 A)。

    ...

  • A 在堆栈中等待恢复。
于 2012-06-15T03:47:33.140 回答