Странное поведение жизненного цикла в моем приложении Заставка - PullRequest
7 голосов
/ 16 июля 2011

Я только что разработал приложение для заставки экрана и обнаружил странное поведение в его жизненном цикле. Мой рабочий процесс выглядит так:

  1. начать мой RegisterService, где я вызываю registerReceiver метод для регистрации BroadcastReceiver, который может получить ACTION_SCREEN_OFF.

2.В методе onReceive этого BroadcastReceiver я запускаю действие в качестве заставки.

3.В действии я пишу оператор Log.i(), чтобы отслеживать его выполнение.

Мой вопрос:

Когда экран отключается или когда я нажимаю клавишу POWER, экран выключается, и система отправляет сообщение ACTION_SCREEN_OFF. Как я и ожидал, мой приемник запускает экранную заставку. Тем не менее, я обнаружил, что эта активность вызывает последовательно onCreate(), onResume(), onPause(), onResume() согласно выводу в logcat.

Кажется, что какое-то действие появляется перед моей заставкой и сразу же заканчивается, поэтому моя заставка вызывает onPause(), а затем onResume(). enter image description here

Есть идеи? Эта проблема мешает мне в программировании, пожалуйста, помогите. Спасибо!

Ответы [ 2 ]

0 голосов
/ 25 августа 2012

На основе краткого изучения PowerManagerService.java исходного кода, когда пришло время выключать экран, система запускает анимацию (смотрите строку 2183 для источника класса), чтобы сделать это , Это означает, что ваша деятельность будет приостановлена, а затем возобновится после окончания анимации.

Я не могу быть на 100% уверен в этом, поскольку я не проверял его в своей среде, но это единственное логическое объяснение, которое я нашел для вашей ситуации.

Надеюсь, это поможет ...

0 голосов
/ 24 августа 2012

Я могу порекомендовать вам что-то очень простое, что может сработать для вас, если вы не хотите использовать режим паузы, почему бы вам не попробовать переопределить метод onPause() и просто не делать ничего: super.onPause() и это прекратит его поведение.

Еще одна вещь, которая может работать для вас, объявить статическую переменную, добавить 1 в метод onResume () и вернуться к «0» при вызове onStop (). Теперь просто оцените, когда вызывается onResume (), и если переменная равна 0, тогда это первый раз, все остальное ничего не делает.

Надеюсь, это поможет, потому что по вашему вопросу не так много информации, чтобы быть более конкретным.

...