2011-07-05 3 views
0

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

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

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

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

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

+0

У вас есть что-нибудь, установленное в 'android: launchMode' для активности A или B в' AndroidManifest.xml'? – inazaruk

+0

Нет. Я пытался использовать singleTop один раз, но это, естественно, не помогло. – Vanja

+0

Все работает отлично в моем местном примере. Вероятно, что-то вам не хватает. Я загрузил свой пример кода здесь: https://github.com/inazaruk/examples/tree/master/ActivityResult. Посмотрите, поможет ли это вам. – inazaruk

ответ

0

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

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> 

Просто добавьте этот код в base Активность в примере кода из индазарука, чтобы убедиться сами. Переключайтесь между Activity A и Activity B пару раз через меню, а затем попытайтесь закрыть все Actitvities в стеке. Это не будет работать.

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

Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 

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

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