Android: когда использовать onStart(), onStop()?

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

Я всегда добавлял код в onPause() и onResume() и никогда не беспокоился с onStart() и onStop().

Может ли кто-нибудь дать конкретные примеры того, что вы могли бы сделать в onStart(), vs. onResume()? То же самое относится к onStop() и onPause(), как onStop() полезно? Я должен упустить что-то принципиальное здесь.

Ответы

Ответ 1

onStop() будет (например) вызываться, когда вы покидаете действие для какой-либо другой деятельности (отредактируйте: почти. см. комментарий коммонсэва о действиях, связанных с диалоговыми окнами). Например, если вы используете startActivity() в действии A, чтобы начать действие B. Когда вы вернетесь в действие B, вы вернетесь к активности A и onStart.

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

Хорошо, но что использовать

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

Таким образом, пример использования для onStart/onStop - это если вы хотите освободить какое-то состояние при оставлении действия для другого и воссоздать его, когда вернетесь. Я использовал его для установки listadapters в нулевые, пустые кэши изображений и т.д. (В особых приложениях). Если вы хотите освободить память, используемую видимыми видами в списке, вы можете воссоздать ее в onstart и позволить просмотрам просматривать gc. Это увеличит вероятность того, что остальная часть состояния памяти будет жить.

Некоторые ресурсы могут считаться достаточно хорошими для сохранения, пока экземпляр активности жив, а некоторые - только когда он находится на передней панели стека. Вы должны решить, что лучше всего в вашем приложении, и это позволяет получить детальную информацию о создании/запуске/возобновлении.

Ответ 2

onStart() работает после того, как onCreate() завершила свою задачу. Это хорошее место, чтобы поместить broadcastReceiver или инициализировать некоторое состояние пользовательского интерфейса, которое должно отображаться последовательно в любое время, когда пользователь вернется к этому действию.

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