重新启动活动后,设置Result()不起作用

时间:2012-06-15 00:40:07

标签: android android-activity restart

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

A以startActivityForResult(getIntent(), ACTIVITY_B);开始B,B以startActivityForResult(getIntent(), ACTIVITY_C);开始C. ACTIVITY_BACTIVITY_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);被忽略,因为它始终在活动A(RESULT_CANCEL)中作为onActivityResult收到。我正在使用2.3。

任何线索?

2 个答案:

答案 0 :(得分:0)

我很好奇你是如何处理你的Intents和Activity生命周期的。

从我在你的两篇文章中读到的内容:

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

现在,除非我缺少某些东西,否则活动B使用以下代码:

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

开始吧?你能澄清一下吗?

<强>加成

我相信你是从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正在堆栈中等待恢复。

答案 1 :(得分: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:在on​​ActivityResult

if (resultCode == Activity.RESULT_OK) {
  // get values from the intent and change B accordingly
}