Странность жизненного цикла Android с сервисом SingleTop и Foreground? - PullRequest
12 голосов
/ 01 декабря 2011

Вот сценарий:

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

... в это время Android восстановит действия A и B из-за того, что процесс неожиданно завершился.Но, несмотря на тот факт, что действие B является однопользовательским, андроид будет порождать его снова, потому что пользователь нажал на уведомление.Это приводит к наличию A -> B -> B в стеке активности.Повторное нажатие приведет вас снова к первому восстановленному экземпляру Занятия B.

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

В чем разница между «Force Stop» из «Настройки» -> «Приложения» и «STOP» из DDMS?

Заранее спасибо!

Ответы [ 3 ]

4 голосов
/ 10 декабря 2011

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

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

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

2 голосов
/ 07 декабря 2011

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

0 голосов
/ 05 февраля 2015

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

...