Почему мое приложение для Android вызывает onCreate(), когда сон инициируется в моем представлении, но не на главном экране?

Мое приложение, кажется, ведет себя отлично, за исключением того, что я не понимаю одной вещи. Когда я нажимаю кнопку «Домой» и возвращаюсь в свое приложение, предыдущее состояние восстанавливается (автоматически). Когда я нажимаю кнопку «Домой», а затем телефон переходит в спящий режим на главном экране (или в любом другом представлении, кроме моего собственного), и я возвращаюсь в свое приложение, предыдущее состояние восстанавливается (автоматически).

Теперь кикер в том, что когда телефон переходит в спящий режим с моей активностью сверху, он НЕ восстанавливает предыдущее состояние автоматически, а, кажется, вызывает onCreate(), потому что происходит начальная инициализация, и мое приложение ведет себя так, как будто оно только что запустилось.

Я могу сохранить экземпляр и восстановить сохраненное состояние с помощью saveInstanceState(), поэтому в конечном итоге проблема разрешима, но мой вопрос: почему Android вызывает onCreate(), если он заснул из-за моей деятельности, но не из другой? И если он не вызывает onCreate(), что происходит и почему я должен беспокоиться о saveInstanceState(), поскольку в каждом случае (за исключением нехватки памяти) мое приложение возвращает пользователя к его последней «метке», ЗА ИСКЛЮЧЕНИЕМ, когда телефон переходит в спящий режим от моей деятельности.


person Marshall    schedule 07.02.2012    source источник


Ответы (3)


Проверьте, заблокировала ли ваша активность ориентацию для книжной или альбомной. Если вы заблокировали ориентацию, она вызовет onCreate() поскольку он меняет ориентацию перед сном и при пробуждении.

вы можете решить эту проблему, добавив android:configChanges="orientation" в тег активности в манифесте.

<activity 
android:name=".MainActivity"
android:screenOrientation="portrait"
android:configChanges="orientation"
/>
person Raneez Ahmed    schedule 06.01.2013
comment
Используйте 1_. Хороший вызов onCreate(), вызываемый во время сна, потому что ориентация меняется. - person Smitty-Werben-Jager-Manjenson; 21.12.2019

Когда у меня возникают проблемы с методами жизненного цикла, я бы добавил onCreate, onPause, onResume и т.д. и т.д. во все мои действия с log.D("in onPause()") внутри, чтобы отследить, какой именно метод вызывается во сколько.

person JakeWilson801    schedule 07.02.2012
comment
Он ведет себя так, как я ожидал, но я до сих пор не понимаю, почему onDestroy вызывается в моем приложении, когда оно сверху, а не сзади. Ну, я думаю, это не имеет большого значения, я действительно не знаю, как работает гравитация, но я могу ее использовать!!! (Надеюсь, когда-нибудь разберусь! :) ) - person Marshall; 08.02.2012

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

Здесь приводится обзор того, когда и как сохранять/ восстановить состояние вашего экземпляра.

person Lawrence D'Oliveiro    schedule 08.02.2012
comment
Спасибо! Будучи новичком, это немного утомительно, но знание C && Java было очень полезным. Я никогда не видел эту статью, на которую вы меня сослали. Хорошая вещь. Тем не менее, я не уверен, почему вызывается onDestroy, если SLEEP активируется, когда мое представление находится сверху, а не когда мое приложение находится в фоновом режиме. Я просто хочу знать ПОЧЕМУ!!! (Я могу сохранить переменные, чтобы пользовательский опыт был безупречен, но...) - person Marshall; 08.02.2012