onActivityResult() не вызывается, когда в стеке достигается та же активность, что и завершающая активность

В моем приложении определенный код результата используется для завершения всего приложения, когда это необходимо (т.е. для завершения всех действий, которые принадлежат моему приложению в стеке действий). Все действия запускаются с помощью startActivityForResult(). Код результата фиксируется в onActivityResult() и оттуда передается следующему действию в стеке действий. Это сводится к тому, что каждое действие завершается само по себе, когда используется определенный код результата.

Отлично работает.. во всех случаях, кроме одного:

Рассмотрим стек Activity, состоящий из A -> B -> A. Последний A (справа в последовательности) запускает процедуру, завершая себя и устанавливая код результата для завершения других Activity. После того, как B закончил и передал код результата первому A (оставил A в последовательности), оказывается, что onActivityResult() не вызывается.

Стоит отметить, что onDestroy() еще не вызывалась для самого верхнего A в стеке (правого A в последовательности), когда достигается первый A.

Как исправить или обойти эту проблему?


person Vanja    schedule 05.07.2011    source источник
comment
У вас есть какие-либо настройки в android:launchMode для действий A или B в AndroidManifest.xml?   -  person inazaruk    schedule 05.07.2011
comment
Нет. Я пытался использовать singleTop один раз, но, естественно, это не помогло.   -  person Vanja    schedule 05.07.2011
comment
В моем локальном примере все работает нормально. Вероятно, вы что-то упускаете. Я загрузил свой пример кода здесь: github.com/inazaruk/examples/tree/master /Результат активности. Посмотрите, поможет ли это вам.   -  person inazaruk    schedule 05.07.2011
comment
Спасибо Иназарук. Приятно знать, что ваш код работает, и попробовать его. Это облегчает поиск причины проблемы (еще не нашел).   -  person Vanja    schedule 08.07.2011


Ответы (1)


Оказалось, что эта проблема появлялась только в том случае, если действие запускалось из меню, написанного со следующим кодом:

    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, чтобы убедиться в этом самостоятельно. Переключитесь между действием A и действием B пару раз через меню, а затем попытайтесь закрыть все действия в стеке. Она не будет работать.

Теперь можно подумать, что причиной был флаг намерения:

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

Однако добавление этого флага ко всем намерениям в код от inazaruk исключает это.

Если кто-то может точно объяснить, что происходит, было бы здорово услышать.

person Vanja    schedule 22.07.2011