0

在我的应用程序中,某个结果代码用于在需要时完成整个应用程序(即完成活动堆栈中属于我的应用程序的所有活动)。所有活动都以 startActivityForResult() 开始。结果代码在 onActivityResult() 中捕获,并从那里传递到 Activity 堆栈中的下一个 Activity。这归结为每个活动在使用特定结果代码时自行完成。

效果很好..在所有情况下,除了一个:

考虑一个由 A -> B -> A 组成的 Activity 堆栈。最后一个 A(序列中的右侧)通过完成自身并设置结果代码来完成其他活动来启动过程。在 B 完成并将结果代码传递给第一个 A(序列中的左侧 A)之后,结果发现 onActivityResult() 没有被调用。

值得一提的是,当到达第一个 A 时,尚未为堆栈中最顶层的 A(序列中的右侧 A)调用 onDestroy()。

如何解决或解决此问题?

4

1 回答 1

0

事实证明,只有当 Activity 从使用以下代码编写的菜单启动时才会出现此问题:

    private static final int MENU_ITEM_A = 0;
    private static final int MENU_ITEM_B = 1;

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
       menu.add(0, MENU_ITEM_A, 0, R.string.menu_item_a);
       menu.add(0, MENU_ITEM_B, 0, R.string.menu_item_b);
       return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
       intent = null;

       switch (item.getItemId()) {
       case MENU_ITEM_A:
          intent = new Intent(this, ActivityA.class);
          break;
       case MENU_ITEM_B:
          intent = new Intent(this, ActivityB.class);
          break;
       default:
          intent = null;
          Log.e(TAG, "Unkown menu item.");
       }
       if (intent != null) {
          intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
          startActivityForResult(intent,
                ActivityHelper.AUTO_CLOSE_REQUEST_CODE);
       }
       return super.onOptionsItemSelected(item);
    }

这是字符串资源

    <string name="menu_item_a">Start Activity A</string>
    <string name="menu_item_b">Start Activity B</string>

只需将此代码添加到来自 inazaruk 的代码示例中的基本 Activity 即可亲自查看。通过菜单在 Activity A 和 Activity B 之间切换几次,然后尝试关闭堆栈中的所有 Activity。不起作用。

现在有人会认为原因是意图标志:

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

但是,将这个标志添加到来自 inazaruk 的代码中的所有意图中排除了这一点。

如果有人能准确地解释发生了什么,那就太好了。

于 2011-07-22T11:07:20.147 回答