onActivityResult() не се извиква, когато в стека се достигне същата активност като крайната дейност

В моето приложение определен резултатен код се използва за завършване на цялото приложение, когато това е необходимо (т.е. за завършване на всички дейности, които принадлежат на моето приложение в стека за дейности). Всички дейности се стартират с startActivityForResult(). Кодът на резултата се улавя в onActivityResult() и оттам се предава на следващата дейност в стека на активността. Това се свежда до това, че всяка дейност завършва сама, когато се използва определен резултатен код.

Работи страхотно.. във всички случаи с изключение на един:

Помислете за стек от дейности, състоящ се от A -> B -> A. Последният A (вдясно в последователността) започва процедурата, като завършва самата себе си и задава кода на резултата за завършване и на другите дейности. След като 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 /ActivityResult. Вижте дали това ви помага.   -  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, за да се убедите сами. Превключете между Дейност А и Дейност Б няколко пъти в менюто и след това опитайте да затворите всички Дейности в стека. Няма да проработи.

Сега човек би си помислил, че причината е флагът за намерение:

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT

Въпреки това добавянето на този флаг към всички намерения в кода от inazaruk изключва това.

Ако някой може да обясни какво точно се случва, ще бъде страхотно да го чуем.

person Vanja    schedule 22.07.2011