16 октября 2014 г.

Задачи и обратный стек (Tasks and back stack). Часть 34 (практика)

Уж чтобы до конца добить данную тему рассмотрим еще один параметр stateNotNeeded.

В альма-матер про него можно почитать тут и тут.

Общий смысл этого параметра сводиться к тому что данный параметр установленный в состояние true может отменить вызов метода onSaveInstanceState(), то есть Активность каждый раз, когда выходит на передний план будет запускаться как будто впервые, то есть не будет сохранять своего состояния и когда будет вызываться метод onCreate(), то туда вместо объекта Bundle будет передаваться null.

Но ключевое слово тут МОЖЕТ Улыбка То есть может отменить вызов а может и нет Улыбка

Когда я пробовал экспериментировать с этим параметром, то у меня он, почему то, не работал. Стал рыскать по сети в чем дело. Нашел вот это

На всякий случай приведу полный диалог, забавный немного

_______________________________________________

Hi,
SDK reference says "If this attribute is set to "true",
onSaveInstanceState() may not be called and onCreate() will be passed
null instead of the Bundle — just as it was when the activity started
for the first time."
I verified it is not true. No matter what value I set stateNotNeeded,
onSaveInstanceState() always gets called!

Is this a bug?

James

_________________________________________________

The documentation says "**may** not be called" (emphasis mine.) It
does not say that the method **will** not be called.

Улыбка 

Так или иначе я вывел приложение АР0003 на очередной этап эволюции добавив Активность J и установив для нее параметр stateNotNeeded="true". В Активность В добавил кнопку запуска Активности J.

И так запускаем приложение АР0003

NN0001

Стартуем Активность В

NN0002

Теперь жмем Start Activity J и смотрим логи

NN0003

NN0004

То есть мы видим что когда Активность J стартовала впервые, то savedInstance получил значение NULL, так как не было сохраненного состояния. По идее параметр stateNotNeeded должен запрещать сохранять состояние Активности, но такого почему-то не происходит. По крайней мере у меня не получилось.

Теперь введем любой текст в поле

NN0005

И поворачиваем устройство, чтобы произошло уничтожение и создание Активности J

NN0006

Как видим Активность J нам сообщает, что она была запущена впервые, но текст который мы ввели сохранился. Это означает что сработал метод onSaveInstanceState() чего при параметре stateNotNeeded  быть не должно.

Посмотрим логи

NN0007

Тут мы видим еще раз, что когда Активность J создавалась в первый раз, то естественно объекта Bundle еще не было и поэтому в метод onCreate() был передан null. Когда же мы повернули экран, то таки сработал метод onSaveInstanceState()  и поэтому произошло сохранение нашего текста в поле, чего по идее, при этом ключе быть не должно.

Но как написано в описании в алма-матер, что метод onSaveInstanceState()  может быть не вызван. Улыбка

Но в моих экспериментах он почему-то все время вызывался, и как видно из моего поиска такое поведение не только у меня.

Так или иначе я просто упомянул этот параметр, дабы он был.

Комментариев нет:

Отправить комментарий