OnResume вызывается снова и снова, когда экран телефона заблокирован

Похоже, что если действие находится на переднем плане, когда экран телефона заблокирован, события трансляции и/или wakelocks вызовут эту функцию onResume, независимо от того, предназначены ли они для вашего приложения или нет. Это происходит, даже если вы не взаимодействуете с телефоном каким-либо образом. Не разблокируйте его, не трогайте его, ничего не делайте, и ваш onResume будет вызываться снова и снова без соответствующего onPause.

Мы заметили это, потому что мы регистрируем событие отслеживания onResume, и мы заметили, что некоторые устройства получают TON этих событий onResume. Мы смогли воспроизвести и заметить, что это случалось каждый раз, когда какое-либо приложение, казалось, получало намерение (например, SugarSync, Google Voice или прослушиватель пассивного местоположения в нашем собственном приложении).

Мы заметили это на Galaxy Nexus и Galaxy S3, работающих под управлением ICS. Интересно отметить, что мы не смогли воспроизвести проблему на желе Bean.

У кого-нибудь есть указатели на то, что может происходить здесь?

Ответы

Ответ 1

Я наблюдал такое же поведение на нескольких телефонах, на которых работает Gingerbread и ICS. Ваше описание соответствует тому, что я видел. По какой-то причине активность активируется onResume, хотя экран все еще заблокирован. Возможно, он возобновляет работу с некоторым событием уровня операционной системы?

Лучшее направление от андроидных документов, похоже, из этого параграфа в определении onResume:

Имейте в виду, что onResume не лучший индикатор того, что ваша активность видна пользователю; системное окно, такое как блокировка клавиатуры, может быть впереди. Используйте onWindowFocusChanged (boolean), чтобы точно знать, что ваша активность видна пользователю (например, чтобы возобновить игру).

При разработке своей деятельности имейте в виду, что onResume можно вызывать несколько раз подряд, без прямого взаимодействия с пользователем. Таким образом, в основном, не помещайте какой-либо код в onResume, который может запускаться только один раз или предназначен для немедленного ответа от пользователя. Вы должны сами решить, работает ли onResume или onWindowFocusChanged для того, что вы хотите сделать.