Проблема упорядочивания стека событий при запуске приложения из установщика приложений Android и с главного экрана

Только для тестирования, я разрешаю загружать и устанавливать приложение APK через URL-адрес. После загрузки по телефону его можно запустить с помощью установщика приложений для Android, который дает пользователю возможность установить его на свое устройство, а затем запустить.

Посмотрите, загрузили ли мы и запустили приложение так, как описано выше. Главная / запуск программы в моем приложении – это страница входа ( Activity A ). Как только пользователь аутентифицируется, они переходят в основную область приложения, например, в Activity B Итак, текущий стек операций этой задачи – A > B

Затем я нажимаю кнопку «домой» на телефоне и вывозим его на главный экран Android. Я заново запускаю приложение с помощью значка в меню, и меня переносят в Activity A вместо Activity B Либо стек операций теперь A > B > A , либо теперь есть две отдельные задачи со стеками активности A > B и A соответственно. Я хочу, чтобы я вернулся к Activity B когда я перезапустил приложение. Нажатие назад, пока в этом состоянии вернет меня в действие Activity B

Это нежелательное поведение происходит только в том случае, если я впервые открою приложение через установщик, а не при открытии приложения через главный экран / меню.

Я заглянул в то, как каждый из этих механизмов начинает свою деятельность. Когда мы используем программу установки приложений, мы видим следующие журналы:

 INFO/ActivityManager(XXXX): Starting activity: Intent { dat=file:///mnt/sdcard/download/[my app].apk cmp=com.android.packageinstaller/.InstallAppProgress (has extras) } INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN flg=0x10000000 cmp=[my package]/[Activity A] } 

Через панель запуска / домашний экран:

 INFO/ActivityManager(XXXX): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=[my package]/[Activity A] } 

Когда мы начинаем с установщика, мы видим, что он использует флаг 0x10000000 , но когда он запускается с запуска, мы видим, что он использует 0x10200000 . Он также использует категорию намерений.

Из документов мы видим, что флаги:

 public static final int FLAG_ACTIVITY_NEW_TASK Constant Value: 268435456 (0x10000000) public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED Constant Value: 2097152 (0x00200000) 

Флаг FLAG_ACTIVITY_RESET_TASK_IF_NEEDED (который используется, когда приложение запускается из FLAG_ACTIVITY_RESET_TASK_IF_NEEDED запуска), как правило, препятствует созданию новой задачи, если она уже существует, и будет восстанавливать последнее использованное действие. Это желаемое поведение. Почему он не работает в этой ситуации? Есть ли что-нибудь, что я могу сделать, чтобы убедиться, что мое приложение всегда будет возвращать меня в последнее действие независимо от того, было ли оно запущено с помощью программы установки / запуска приложения?

Если я использую singleTask он всегда будет возвращать меня к основной активности ( Activity A ), когда я запускаю приложение (что также нежелательно).

Вот вопрос, который я нашел, когда кто-то сталкивается с подобной проблемой (у которой нет принятого ответа): приложение теряет способность запоминать свой стек при запуске из другого приложения

EDIT: проверка флага FLAG_ACTIVITY_BROUGHT_TO_FRONT в onCreate() нашей активности запуска (а затем завершение, если она установлена), по-видимому, фиксирует главный симптом, но, очевидно, основная проблема все еще существует. Есть ли более полное исправление?

EDIT2: тот же результат возникает, когда вы загружаете / запускаете приложение из Android Market, поэтому некоторые из вышеперечисленных данных могут быть неактуальными.

Solutions Collecting From Web of "Проблема упорядочивания стека событий при запуске приложения из установщика приложений Android и с главного экрана"

Добавлен ответ, который дал антонит:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // Activity was brought to front and not created, // Thus finishing this will get us to the last viewed activity finish(); return; } // Regular activity creation code... } 

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

Ваше исправление (или что-то вроде этого ), вероятно, будет вашим лучшим выбором.

Ваша проблема, скорее всего, связана с тем, что установщик приложений не использует категорию LAUNCHER, также как и панель запуска.

Эта ошибка была задокументирована в другом месте:

Приложение всегда запускается из корневой активности, а не возобновляет фоновое состояние (известная ошибка)