Нажатие кнопки питания теперь вызывает onStop в Activity на Android KitKat, ранее было просто onPause?

Поэтому я только что понял, что в моей Активности вызывается onStop, когда нажимают кнопку питания, чтобы выключить экран. Ранее вызывался только onPause. Было ли это изменение KitKat и есть ли какие-нибудь заметки о нем (было ли это преднамеренно)? Это изменение KitKat или что-то, что внедрили конкретные производители?

РЕДАКТИРОВАТЬ: Я буду обновлять это в ближайшее время с дополнительной информацией. Я думаю, что изменение было более тонким, чем я впервые осознал, возможно, из-за того, что у меня была частичная блокировка следа или прослушивание обновлений GPS. Несмотря на это, я знаю только то, что в моем коде до KitKat onStop не вызывался при нажатии кнопки питания. Возможно, это также зависит от устройства.

РЕДАКТИРОВАТЬ: Новая информация. При следующих настройках onStop() не вызывается при нажатии кнопки питания: Android minSDKVersion=4 и targetSDKVersion=8 (если вы используете Android Studio, также установите compileSdkVersion=8). Проверено это на 2 устройствах (на которых запущены KitKat и JellyBean). Таким образом, эта проблема не связана с KitKat, как было впервые упомянуто в оригинале, а с минимальными целевыми настройками SDK. Баунти будет вручен тому, кто сможет найти ссылки, когда он изменился, или, по крайней мере, показать первый параметр min / target sdk, который изменил поведение вызова onStop при нажатии кнопки питания.

5 ответов

Решение

Изменения в жизненном цикле произошли с Honeycomb или при изменении приложения с таргетингом на SDK 10 или ниже на приложение с таргетингом на SDK 11 или выше.

Если проект Android объявляет targetSDKversion 10 или менее, то при нажатии кнопки питания вызывается onPause, но не onStop. Это противоречит тому, что думают многие люди. При targetSDKversion = 11 или выше, однако, onPause, затем onStop будет вызываться при нажатии кнопки питания.

Следует отметить, что в некоторых документах указывается, что onStop будет "вызываться, когда действие больше не отображается для пользователя, потому что другое действие было возобновлено и покрывает это" (выделение добавлено), но во многих других местах, он просто утверждает, что onStop будет вызываться всякий раз, когда текущая активность больше не видна. Поэтому до SDK 11 возможно, что нажатие кнопки питания было специально предназначено для вызова onPause, потому что никакое другое действие не покрывало текущее. Экран был просто выключен. Затем с помощью Honeycomb они изменили реализацию, чтобы соответствовать другой интерпретации (больше не видно).

Еще одно важное замечание

Если вы измените настройку блокировки телефона через 10 секунд после нажатия кнопки питания, то функция onStop() будет вызвана через 10 секунд после нажатия кнопки питания.

ИМО, Киткат не имеет к этому никакого отношения. onStop() будет вызываться всякий раз, когда ваша деятельность больше не видна пользователю. Когда ваш экран выключается (например, когда вы нажимаете кнопку питания, чтобы заблокировать экран), onPause() будет называться первым. Затем должен быть вызван onStop(). Но это зависит от ситуации с памятью устройства. Если вы используете устройство с нехваткой памяти, которое не может предоставить достаточно памяти для поддержания процесса вашей активности, onStop() может не вызываться. Вы можете видеть, что только onPause() называется в этой ситуации. Для справки: http://developer.android.com/reference/android/app/Activity.html

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

Специально не указано, что именно поэтому вы испытываете изменение жизненного цикла, но IMO, если Android теперь автоматически пытается создать "более скудную" среду, может заставить приложение вызывать onStop(), когда освобождает ресурсы.

Я знаю, что это не точный ответ, но я надеюсь, что это поможет. Я согласен, что так было не всегда, и вы определенно найдете здесь кое-что интересное.

Ваша активность в состоянии паузы будет вызываться только в том случае, если ваша деятельность все еще частично видна пользователю, в противном случае она будет остановлена.

Так кнопка питания всегда звонила onStop() потому что ваша деятельность фактически остановлена, а не просто приостановлена.

Другие вопросы по тегам