Жизненный цикл Android: заполнять данные в действии в onStart() или onResume()?

Должны ли вы получать данные с помощью курсора и заполнять данные на экране, например, устанавливать заголовок окна, в onStart() или onResume()?

onStart() казалось бы логичным местом, потому что после onStart() активность уже может быть отображена, хотя и в фоновом режиме. Примечательно, что у меня возникла проблема с управляемым диалогом, что заставило меня переосмыслить это. Если пользователь поворачивает экран, пока диалоговое окно все еще открыто, onCreateDialog() и onPrepareDialog() вызываются между onStart() и onResume(). Если диалог должен быть основан на данных, вам нужно иметь данные до onResume().

Если я прав насчет onStart(), то почему пример Блокнота дает плохой пример, делая это в onResume()? См. http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html NoteEditor.java, строка 176 (title = mCursor.getString...).

Кроме того, что, если моя активность запускает другую активность/диалог, который меняет данные, которые отслеживает мой курсор. Даже в самом простом случае означает ли это, что мне нужно вручную обновить мой предыдущий экран (слушатель диалога в основном действии) или, в качестве альтернативы, мне нужно зарегистрировать ContentObserver, так как я m больше не обновляет данные в onResume() (хотя, конечно, я мог бы обновить его дважды)?

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


person pjv    schedule 08.01.2011    source источник


Ответы (2)


Чтобы ответить на ваш вопрос о NoteEditor, просто взгляните на строки над той, которую вы цитируете, и вы увидите...

    // Requery in case something changed while paused (such as the title)
    mCursor.requery();

Комментарий, кажется, все объясняет. Хотя я сам не рассматривал пример NotePad, похоже, что авторы встраивают возможность восстановления после изменений, когда NoteEditor приостановлен (а затем возобновлен).

Как объясняет GSree (пока я печатал это), нет правильного или неправильного ответа, и это просто зависит от того, что нужно сделать в какой момент жизненного цикла Activity.

person Squonk    schedule 09.01.2011
comment
Это просто говорит о том, что они запрашивают после паузы. Я предложил то же самое в своем вопросе. Ваша точка зрения? Очевидно, что это просто плохой пример, а не ошибка в Блокноте, потому что ничто другое, с чем взаимодействует NoteEditor, не усиливает разницу между onStart() и onResume() в их случае. - person pjv; 09.01.2011
comment
@pjv: Я хочу сказать, что onPause() -> onResume() -> onPause() -> onResume() и т. д. и т. д. может повторяться много раз без onPause() -> onStop() -> onRestart() -> on Start( ) (или onPause() -> onStop() -> onDestroy() -> onCreate() -> onStart()). Если существует возможность критического изменения чего-либо во время цикла onPause() -> onResume(), тогда имеет смысл «сделать» (и «повторить») что-то в onResume(), а не в onStart(). - person Squonk; 09.01.2011
comment
Хорошо, это яснее, и вы правы, тогда я бы также посмотрел на «повторить» в onResume(). - person pjv; 09.01.2011

Опять же, решение зависит от того, что вам подходит.

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

Если вы хотите, чтобы курсор предварительно заполнялся каждый раз, когда начинается видимое время жизни (в большинстве случаев служба/трансляция вызывает вашу активность, вы должны использовать onStart()

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

Надеюсь, это проясняет

person GSree    schedule 09.01.2011
comment
Если у вас есть диалоговое окно, которое а) основано на ваших данных и б) изменяет эти данные, вам необходимо а) загрузить данные курсора в onStart() для целей onPrepareDialog(), И, б) перезагрузить данные курсора в onResume(), так как данные могли измениться после приостановки?? - person pjv; 09.01.2011
comment
@pjv Основываясь на том, что вы просили, вы можете просто загрузить данные в метод onResume(). Управляйте жизненным циклом диалога в onResume(). См. документацию по действиям (developer.android.com/guide/topics/fundamentals. html#actlife). Активность будет проходить onResume до того, как пользователь сможет с ней взаимодействовать. - person GSree; 09.01.2011
comment
спасибо за ваш комментарий, но, как я уже сказал во втором абзаце wrt. управляемый диалог: onCreateDialog() и onPrepareDialog() вызываются перед onResume(). Я бы предпочел не брать управление диалогом в свои руки, когда есть вполне пригодная для использования реализация платформы. - person pjv; 09.01.2011