Почему onStop вызывается сразу после запуска моей активности?

У меня есть активность, которая должна включать экран при запуске (на всякий случай, когда экран был выключен). Итак, в моем onCreate у меня есть:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
            |WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
            |WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
            |WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);

Используя эту прямую комбинацию, я могу заставить свою активность отображаться всякий раз, когда она запускается из моей фоновой службы (да, это законный случай).

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

  • OnCreate
  • OnStart
  • onResume
  • OnPause
  • OnStop
  • OnStart
  • onResume

Видишь? Для простого запуска активности onStart вызывается дважды. И что еще более важно, onStop загадочно называется, хотя активность была только начата - и ничего не произошло, что могло бы остановить ее.

Я тестировал это во многих разных сценариях, и кажется, что это странное поведение происходит только тогда, когда экран выключен и активность запускается после его уничтожения. Если экран включен, или если действие было остановлено [но еще не уничтожено], активность запускается нормально, а onStart вызывается только один раз.

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

Итак: почему это происходит? И есть ли что-нибудь, что я могу сделать, чтобы обойти это (чтобы onStop не вызывался до тех пор, пока не будет законной причины для этого)?


Примечания:

  • В рассматриваемой деятельности используется singleTask launchmode
  • Я попытался отключить keyguard/lock, но он не имеет эффекта
  • Я наблюдаю это поведение на Samsung Galaxy Tab 10.1 под управлением Android 3.2. Я не проверял, распространяется ли это на что-либо еще...

Ответ 1

У меня была аналогичная проблема: Действие Lifecycle X Кнопка питания X Lock Screen

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

Решение заключалось в добавлении android: configChanges = "orientation" в Activity в моем AndroidManifest.xml.

Ответ 2

Как было предложено @cyberhuman, ответ на этот вопрос OnPause и OnStop(), вызываемый сразу после запуска активности, указал мне в правильном направлении.

Моя проблема с завершением полного жизненного цикла 'dummy' до фактического отображения пользователю заключалась в том, что моя попытка воспроизвести рингтон, когда активность стала видимой, была напрямую отключена дополнительным, последующим "onStop()" и использование флагов для правильной работы активности при запуске, когда экран выключен/когда экран заблокирован/когда экран включен/когда активность работает в фоновом режиме, не удалось.

Я, наконец, решил свою проблему, переопределив метод onWindowFocusChanged (boolean hasFocus) и оттуда выпустив рингтон. Поместите его здесь, если у кого-то будет такая же проблема.

Ответ 3

Вы можете проверить ситуацию в onStart, установить статическую или глобальную переменную, а затем проверить переменную в onStop, чтобы переопределить стандартное поведение.