Почему onRestoreInstanceState не согласуется, когда экран тускнеет - PullRequest
3 голосов
/ 12 ноября 2011

Я сохраняю данные о состоянии в функции onSaveInstanceState моей деятельности и восстанавливаю эти данные в onRestoreInstanceState. Этот код отлично работает в 95% случаев.

Я нашел тестовый пример, который заставляет Android выдавать разные результаты от теста к тесту, и я понятия не имею, почему. У меня оригинальный телефон Droid, и у него есть выдвижная клавиатура. В моем приложении я выполняю 2 теста, которые позволяют мне воспроизвести ситуацию, когда данные не восстанавливаются, потому что onRestoreInstanceState не вызывается. Тесты почти идентичны, но поскольку я получаю немного другие результаты, очевидно, что-то немного по-другому.

Контрольный пример 1 (телефон в портретном режиме, клавиатура в комплекте):

1. Populate the Activity with data
2. Press my phone's power button to purposely dim the screen. (The phone is now locked)
3. Immediately after step 2, slide out my phone's keyboard, switching the phone to landscape mode.
4. About 80% of the time, the screen lights up, giving me the option to unlock the phone. (See difference in other test case).
5. Unlock the phone, which immediately takes me to my last Activity. Function onRestoreInstanceState is not called about 75% of the time.

Контрольный пример 2 (телефон в альбомном режиме, клавиатура отключена):

1. Populate the Activity with data
2. Press my phone's power button to purposely dim the screen. (The phone is now locked)
3. Immediately after step 2, slide in my phone's keyboard, switching the phone to portrait mode.
4. Majority of the time, the screen is not lit up. I have to press my phone's power button to light the screen up, which then allows me to unlock the phone.
5. Unlock the phone, which immediately takes me to my last Activity. Function onRestoreInstanceState is not called about 20% of the time.

Тестовый пример 1 не восстанавливает данные примерно в 60% случаев. Тестовый пример 2 не может восстановить данные примерно в 20% случаев. Единственное отличие, которое мне действительно бросается в глаза, это то, что экран подсвечивается после нажатия или выдвижения клавиатуры. Когда этот экран загорается, данные исчезают практически каждый раз.

Если затемнить экран, а затем передвинуть и вынуть клавиатуру примерно 10 раз подряд, прежде чем разблокировать телефон и вернуться в приложение, я воспроизвожу эту проблему почти 100% времени .

Во всех случаях, когда данные были успешно восстановлены, вот последовательность вызова:

onSave
onStop
onDestroy
onCreate
onStart
**onRestore**
onResume

Во всех случаях, когда данные не удалось восстановить успешно, последовательность вызова была:

onSave
onStop
onDestroy
onCreate
onStart
onResume

Может кто-нибудь сказать мне, что здесь происходит? Почему я получаю разные результаты, выполняя один и тот же точный тест? Если я запускаю тестовый пример № 1 (или № 2) снова и снова, результаты никогда не будут прежними. Я хотел бы понять, почему это происходит, но что более важно (если окончательный ответ невозможен), я просто хочу, чтобы данные сохранялись каждый раз, так что мне делать? Я думал, что перемещение кода, находящегося в onRestoreInstanceState, в onCreate решит проблему, но я просто несколько раз запускал свои тестовые примеры и видел, что бывают случаи, когда Bundle, передаваемый в onCreate, равен нулю, что означает, что мои данные не восстанавливаются.

Если я не могу рассчитывать на Bundle в onCreate и не могу рассчитывать на вызываемый onRestoreInstanceState, что же осталось? Мой единственный вариант на Resume? Эта деятельность поддерживает много данных. Должен ли я рассмотреть использование onRetainNonConfigurationInstance и getLastNonConfigurationInstance, вызывая getLastNonConfigurationInstance в onResume? Ранее я использовал эти функции, но отказался от них из-за потери данных. В то время я не знал, почему, но подозреваю, что это именно из-за этой проблемы. Но когда я использовал их ранее, я вызвал getLastNonConfigurationInstance в onCreate. Возможно, было бы иначе / лучше, если бы он вызывался из onResume?

...