Подтвердить что ты не робот

Неисправность жизненного цикла Android с помощью услуги SingleTop и foreground?

Здесь сценарий:

  • Начало деятельности A
  • Действие A запускает службу S
  • Служба S запускается в режиме переднего плана и отображает уведомление, которое при нажатии приводит пользователя к Activity B (у которого есть launchMode = "singleTop" )
  • Активность B отображается
  • Нажмите HOME
  • Перейдите в DDMS и убейте свой прикладной процесс, чтобы имитировать, что ваше приложение умерло (нажмите красную кнопку STOP)
  • Android скажет: "Перепланировать аварийную службу в 5000 мс" (иногда дольше)
  • Отображаются перезагрузки службы S и уведомление.
  • Нажмите на значок уведомления, когда служба перезагрузится...

... в это время Android восстановит обе операции A и B из-за того, что процесс закончился неожиданно. Но, несмотря на то, что Activity B является singleTop, андроид будет порождать его с возрастом, потому что пользователь нажал на уведомление. Это приводит к тому, что A → B → B в стеке активности. При повторном нажатии вы снова войдете в первый восстановленный экземпляр Activity B.

Может ли кто-нибудь из команды Android прояснить, что происходит за кулисами, и как этого избежать? Каков наилучший способ имитации того, что Android убил процесс из-за низкой памяти? Является ли нажатие STOP из DDMS достаточно хорошим или крайним, и это не должно случаться при нормальных обстоятельствах?

В чем разница между "Force Stop" из "Настройки" → "Приложения" или "СТОП" из DDMS?

Спасибо заранее!

4b9b3361

Ответ 1

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

Проверьте свое приложение, чтобы убедиться, что он не вызывает startActivity() при повторной инициализации или выполнении чего-то подобного. Посмотрите в журнале, чтобы узнать, какие действия запускаются и какие намерения используются. Используйте "активность dbsys оболочки adb", чтобы увидеть, как выглядит текущий стек операций. Возможно, вы очистили близость задачи, поэтому вторая активность B запускается в своей собственной задаче (в этом случае singleTop не повлияет)?

Также очень сложно помочь людям, если вы не включаете полезные сведения о том, что вы делаете. Соответствующие операторы журналов на разных этапах, состояние стека активности, показанное "действие dumpsys оболочки adb" и т.д.

Ответ 2

Я не слишком уверен в подробных различиях между STOP в DDMS и Force Stop, но я уверен, что DDMS обходит некоторые внутренние функциональные возможности Android, которые Force Stop будет выполнять, поскольку я не помню, как Android обновлял мои действия, когда я делал Force Stop. Если это так, то я подозреваю, что то, что вы видите, является результатом двух разных задач, запущенных Android: один для старых, убитых действий и другой для перезапуска убитой службы. Вы можете проверить эту теорию, установив флаг в "singleTask" и проверив, происходит ли такое же поведение. Надеюсь, это поможет.

Ответ 3

Наличие A → B → B возможно даже тогда, когда B одноточечное: для ситуации, когда B запускается как другая задача. В случае, если на самом деле есть 2 стопки: A → B и B