Повторно открыть приложение после убийства, открывает предыдущую активность

Моя история приложений в норме; Я не использую никаких причудливых флагов или чего-то еще, когда запускаю намерения. Только последовательные однозадачные запущенные действия. Если я иду домой, а затем использую убийцу задач, чтобы убить свое приложение, в следующий раз, когда я открою приложение, оно запустится в последнем действии, которое я выполнял перед убийством, а не в объявленном основном действии. Кроме того, если я затем нажму «Назад», чтобы выйти из приложения и снова открыть его, я получу любую активность, которая была открыта до той, которую я ранее открывал до убийства.

Что-то вроде этого:

A = основная деятельность; B = Другая деятельность; C = Другая деятельность

  • Открыть приложение – A
  • Открыть B - B
  • Открыть C - C
  • Убить приложение с помощью тасккиллера
  • Открыть приложение — C
  • Кнопка «Назад» – главная страница устройства
  • Открыть приложение – B
  • Кнопка «Назад» – главная страница устройства
  • Открыть приложение – A

Я ожидаю, что backstack не запомнится после завершения задачи. Я ожидаю, что приложение всегда будет запускаться с объявленной основной активности, если только оно еще не запущено в фоновом режиме. (что здесь не так, поскольку используется убийство). Обе эти вещи, похоже, не происходят, однако, и я не знаю, почему.

Я попытался добавить некоторый код, чтобы установить «инициализированное» логическое значение в моем классе Application для onCreate A, а затем проверить его в B и C< /strong> onCreate. Идея состояла в том, чтобы запустить намерение A с флагами NEW_TASK и CLEAR_TOP, чтобы попытаться обнаружить и исправить сценарий, но он по-прежнему демонстрировал точно такое же поведение, за исключением того, что он также помещал A поверх того, что осталось. Таким образом, вместо того, чтобы запускать приложение в B, оно будет запускать приложение в BA.

Основываясь на всем, что я читал о жизненном цикле активности и уничтожении приложений операционной системой, это невозможно, но это определенно происходит на всех моих тестовых устройствах. У кого-нибудь есть идеи относительно того, что может быть причиной этого странного поведения?


person Dave    schedule 09.04.2013    source источник
comment
Вы хотите запускать действие A всякий раз, когда пользователь запускает ваше приложение с главного экрана?   -  person Hoan Nguyen    schedule 10.04.2013
comment
Это моя цель, да.   -  person Dave    schedule 10.04.2013
comment
Единственный способ сделать это сложным, и вы увидите много мерцания в зависимости от размера стека задач вашего приложения.   -  person Hoan Nguyen    schedule 10.04.2013
comment
Пожалуйста, опубликуйте свой манифест.   -  person David Wasser    schedule 24.04.2021
comment
@Dave, прежде чем я опубликую свой ответ, я хочу знать, используете ли вы android: alwaysRetainTaskState как true в своем приложении?   -  person Imtiyaz Khalani    schedule 28.04.2021


Ответы (2)


Ваше приложение ведет себя нормально. Это поведение по умолчанию. Android убьет приложение, если оно находится в фоновом режиме, а другому приложению нужны ресурсы. Когда пользователь возвращается к исходному приложению, он ожидает, что вернется к нему в том же состоянии, в котором он его покинул, поэтому Android запоминает состояние и восстанавливает его. Это стандартное поведение по умолчанию, ожидаемое пользователем.

Если вы не хотите такого поведения, вы должны добавить

android:clearTaskOnLaunch="true"

к объявлению <activity> для вашего корня Activity (тот, у которого ACTION=MAIN и CATEGORY=LAUNCHER) в манифесте. Это заставит Android запускать ваше приложение с нуля, когда пользователь вернется к нему с экрана HOME.

Если вы также не хотите, чтобы пользователи возвращались в предыдущее состояние вашего приложения при запуске с экрана «Недавние задачи», вам нужно добавить

android:excludeFromRecents="true"

к объявлению <activity> для вашего корня Activity. Это не позволит Android добавить ваше приложение в список недавних задач, поэтому пользователи не смогут вернуться к вашему приложению с экрана «Недавние задачи».

person David Wasser    schedule 24.04.2021

Я не думаю, что с вашим приложением что-то не так. Большинство таск-киллеров просто вызывают restartPackage() для выбранного приложения, что заканчивается вызовом saveInstanceState(), так что ваше приложение сохраняет свое состояние. Это увеличивает вероятность того, что он будет загружен из памяти, но только в том случае, если Android нуждается в памяти. По сути, приложения-«убийцы задач» ничего не убивают.

Из документов ActivityManager, restartPackage() совпадает с killBackgroundProcesses(), а последний делает «Это то же самое, что и ядро, убивающее эти процессы для освобождения памяти; система позаботится о перезапуске этих процессов в будущем по мере необходимости».

person Yojimbo    schedule 10.04.2013
comment
Это происходит, если я также завершаю приложение из Eclipse, что, честно говоря, я точно не знаю, как IDE выполняет функцию завершения. Можно ли заставить приложение всегда запускаться с правильного основного действия? - person Dave; 10.04.2013