onActivityResult () не вызывается при достижении в стеке того же действия, что и завершающее действие - PullRequest
0 голосов
/ 05 июля 2011

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

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

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

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

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

1 Ответ

0 голосов
/ 22 июля 2011

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

    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 исключает это.

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

...