Учебное пособие по Android Notepadv3. Действительно ли необходимо saveState() в onSaveInstanceState?

Я только новичок в Android, но я заметил ряд вещей, которые кажутся немного странными в третьем уроке по блокноту:

  • В учебнике прямо указано, что вам нужно вызывать saveState из ОБА onSaveInstanceState и onPause. Это действительно необходимо? Из чтения документации по жизненному циклу процесса мне кажется, что onPause всегда будет вызываться до того, как действие будет уничтожено, независимо от того, сделано ли это системой или пользователем. Если это так, то достаточно ли просто вызвать saveState из onPause?
  • Вызов populateFields() как в onResume, так и в onCreate бессмысленен, поскольку onResume все равно всегда вызывается после onCreate. Следовательно, если я правильно понимаю, вызов onCreate бесполезен и может быть безопасно удален.

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

Олли


person Olly    schedule 08.09.2010    source источник
comment
Кроме того, разве метод onResume в этом примере не является совершенно бессмысленным? Согласно документам жизненного цикла, приостановленное действие сохраняет все свое состояние, так какой смысл повторно заполнять поля, когда оно не приостановлено (учитывая, что их нельзя изменить где-либо еще)?   -  person Olly    schedule 09.09.2010
comment
Что ж, очень распространенным шаблоном является представление списка, когда щелкается строка, открывается новое действие, позволяющее редактировать элемент, который был нажат. Когда это произойдет, вы захотите обновить данные во время onResume, чтобы список отражал эти изменения. На первый взгляд в этом примере кажется, что они на самом деле извлекают данные из базы данных, которые могли быть изменены. Скорее всего, им не нужно вызывать populateFields() в onCreate, но им нужно оставить его в onresume.   -  person Mike    schedule 09.09.2010
comment
Разве недостаточно поместить вызов populateFields() в onCreate, а не в onResume? Нет ситуации (насколько я могу судить), когда базовые данные могут измениться, когда это действие приостановлено, поэтому нет необходимости загружать его каждый раз, когда действие не приостановлено?   -  person Olly    schedule 09.09.2010
comment
Да, если вы правы в том, что данные не будут изменены, пока это действие приостановлено, то onCreate должно быть достаточно.   -  person Mike    schedule 09.09.2010


Ответы (1)


Насколько я понимаю...

Вы правы в том, что onResume всегда вызывается после onCreate, и вы часто можете поместить туда код. Имейте в виду, что onResume также будет вызываться, когда действие возвращается на передний план, без предварительного прохождения onCreate. Таким образом, для одноразового кода инициализации (например, setContentView() или инициализации переменных) лучше использовать событие onCreate.

Кроме того, вы правы насчет onPause и onStop. onPause — это место, где вы обычно кодируете обработку состояния. onPause можно убить, так что onStop потенциально может даже не вызываться в ситуациях с очень нехваткой памяти.

person Mike    schedule 08.09.2010
comment
К сожалению, я только что заметил, что вы имели в виду onSaveInstanceState, а не onStop (не знаю, как я сбился с пути, извините). Их пример правильный. В то время как savestate будет вызываться дважды, им нужно вызвать его в onSaveInstanceState, чтобы получить идентификатор новых данных для добавления в пакет, и в onPause (в случае, если onSaveInstanceState не вызывается), просто чтобы убедиться, что данные по крайней мере спасли. - person Mike; 09.09.2010
comment
Ах - Игнорируйте мой предыдущий пост здесь .. болтая чепуху :). Спасибо. - person Olly; 09.09.2010
comment
saveState, вызываемый onSaveInstanceState, изменяет mRowId, который затем помещается в пакет следующей строкой в ​​onSaveInstanceState. Хотя этот rowid технически является постоянным в том смысле, что он находится в базе данных, то, как они его там используют, это не так. Там они используют его, чтобы узнать, какая заметка отображается. Однако именно поэтому они также вызывают saveState в событии onPause. В этот момент их не интересует, какой идентификатор отображается, а то, что данные сохранены и не потеряны. Поскольку onSaveInstanceState не может вызываться, они также должны вызывать его из onPause. - person Mike; 09.09.2010