Только для тестирования, я разрешаю загружать и устанавливать приложение 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
. Он также использует категорию намерений.
Из docs мы видим, что флаги:
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
(который используется, когда приложение запускается из панели запуска), как правило, препятствует созданию новой задачи, если она уже существует, и будет восстанавливать последнее использованное действие. Это желаемое поведение. Почему это не работает в этой ситуации? Есть ли что-нибудь, что я могу сделать, чтобы убедиться, что мое приложение всегда будет возвращать меня в последнее действие независимо от того, было ли оно запущено с помощью программы установки/запуска приложения?
Если я использую singleTask
, он всегда будет возвращать меня к основной активности (Activity A
) всякий раз, когда я запускаю приложение (что тоже нежелательно).
Вот вопрос, который я нашел, когда кто-то сталкивается с подобной проблемой (у которой нет принятого ответа): Приложение теряет способность запоминать свой стек при запуске из другого приложения
EDIT: проверка флага FLAG_ACTIVITY_BROUGHT_TO_FRONT
в onCreate()
нашей активности запуска (а затем завершение, если она установлена), по-видимому, фиксирует основной симптом, но, очевидно, основная проблема все еще существует. Есть ли более полное исправление?
EDIT2: тот же результат возникает, когда вы загружаете/запускаете приложение из Android Market, поэтому некоторые из приведенных выше сведений могут быть неактуальными.