Соединение GoogleAPIClient в onCreate и onStart

Выдержка из документация клиента Google API,

public GoogleApiClient.Builder enableAutoManage (FragmentActivity
fragmentActivity, GoogleApiClient.OnConnectionFailedListener
unresolvedConnectionFailedListener)

Включает автоматическое управление жизненным циклом в библиотеке поддержки FragmentActivity, которая подключает клиента в onStart() и отключает его в onStop().

Он соответствующим образом обрабатывает восстанавливаемые пользователем ошибки и вызывает onConnectionFailed(ConnectionResult) для неразрешенного ConnectionFailedListener, если ConnectionResult не имеет разрешения. Это устраняет большую часть шаблонов, связанных с использованием GoogleApiClient.

Хотя это может звучать немного наивно, но мой вопрос заключается в том, является ли важным шагом начало подключения GoogleAPIClient в методе onStart? Будет ли вред, если вместо этого я сделаю соединение в onCreate? У меня есть несколько сценариев, в которых я вижу необходимость подключения к googleApiClient в onCreate из-за устаревшего кода. Я также попытался установить соединение в onCreate, и это работает (я не вижу сбоев). Это плохая идея? Так почему же необходимо или важно запускать соединение в onStart и останавливать соединение в onStop?




Ответы (2)


Вы можете обратиться к этому потоку: Что на самом деле делает onStart()? - Android

onStart() вызывается, когда активность возобновляется из остановленного состояния. Например, если у вас есть действие A и вы начинаете с него действие B, то действие A будет приостановлено (onPause()), а затем остановлено (onStop()) и перемещено в задний стек. После этого, если вы нажмете Назад в своем действии B, оно будет приостановлено (onPause()), остановлено (onStop()) и уничтожено (onDestroy()), а действие A будет восстановлено из заднего стека, запущено (onStart()) и возобновлено (onResume()). Как видите, система больше не будет вызывать onCreate() для A.

Как использовать onStart()? Например, вы должны отменить регистрацию слушателей для GPS, датчиков и т. д. в onStop() и снова зарегистрироваться в onStart(). Если вы зарегистрируете его в onCreate() и отмените регистрацию в onDestroy(), то служба GPS будет работать всегда и будет разряжать батарею.

Также было указано, что основная роль onStart() — это когда действие вызывается после паузы. Если вызывается onCreate(), то все инициализации должны быть выполнены заново, с помощью onStart() мы можем инициализировать те вещи, которые были неинициализированы в onstop().

person abielita    schedule 07.11.2017

Перемещение кода с onStart на onCreate вызовет проблемы. Возьмем, к примеру, приложение, которое использует службы определения местоположения для отображения местоположения на карте. Это хорошо зарекомендовавшее себя приложение, которое перестает использовать службы определения местоположения onStop, когда пользователь больше не использует приложение.

  1. Пользователь запускает приложение (onCreate, onStart)
  2. Пользователь уходит (onStop)
  3. Пользователь возвращается в приложение до того, как оно будет уничтожено (onStart, но не onCreate)

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

person mattm    schedule 07.11.2017
comment
Спасибо за ответ @mattm. Но если вы, скажем, самостоятельно справитесь с подключением, это не вызовет никаких проблем? Это всего лишь рекомендация, а не необходимость, верно? Запуск в исключениях и т. д.? - person Ahmed; 07.11.2017
comment
@Ahmed В приведенном мной примере приложение не аварийно завершает работу, но не работает. Это происходит, даже если вы сами управляете подключением. - person mattm; 07.11.2017
comment
Тогда что будет идеальным решением? Отдельное примечание: EnableAutoManage тоже не кажется стабильным. - person Ahmed; 07.11.2017