Я хочу знать, что является лучшим местом в Activity для привязки к сервису?
Я видел примеры, сделанные в onResume()
, а также в onCreate()
. Я спрашивал себя, не помешает ли это в onCreate()
, потому что в onPause()
я буду отключать службу, поэтому я не получаю serviceConnectionLeak, если я оставлю действие. Теперь, если я нажму кнопку "Главная", а затем переключится на главный экран, Activity отменит связь с сервисом, когда я вернусь к Activity из диспетчера задач, тогда onCreate()
не будет вызываться, и если код пытается доступ к функции из службы, я получу исключение NullPointerException. Если я свяжусь и отвяжу только в onResume()
и onPause()
, у меня нет этой проблемы. Я прав?
Привязка к службе в onCreate() или in onResume()
Ответ 1
Обычно я рекомендую сделать это в onCreate()
/onDestroy()
или onStart()
/onStop()
, в зависимости от семантики, которую вы хотите:
-
Если ваш
Activity
хочет взаимодействовать сService
все время его запуска (например, возможно, он может получить некоторые данные из сети для вас и вернет данные, когда они готовы, и вы хотите чтобы это происходило в фоновом режиме, поэтому, если пользователь вернется, у вас будут готовые данные), возможно, подходитonCreate()
/onDestroy()
. Обратите внимание, что семантика здесь заключается в том, что все время, когда вашActivity
работает, ему нуженService
, поэтому, если этотService
работает в другом процессе, тогда вы увеличили его вес и сделали его более вероятным для него быть убитым в фоновом режиме. -
Если ваш
Activity
заинтересован только в работе сService
, пока он виден, то подходитonStart()
/onStop()
. Это означает, что вашActivity
будет отвязан отService
, когда пользователь покинет его (и он больше не будет виден) и подключится к резервному копированию в следующий раз, когда будет возвращен, и он будет перезапущен и возобновлен.
Обычно я не рекомендую делать bind/unbind в onResume()
и onPause()
. Обычно они не будут значительно уменьшать сумму, которую вы используете Service
(и, следовательно, ваши накладные расходы), и на самом деле, поскольку пауза и возобновление происходит при каждом изменении активности, это путь кода, который вы хотите сохранить как можно более легким, Выполнение этого здесь может иметь другие неожиданные негативные последствия: например, если несколько Activity
в вашем приложении привязаны к тому же Service
, когда происходит переход между двумя из этих действий, Service
также может быть уничтожен и воссоздан как текущий Activity
приостанавливается до следующего возобновления.
Также эти пары (onCreate()
/onDestroy()
, onStart()
/onStop()
, onPause()
/onResume()
) предназначены для правильных пар для получения и затем выделения ресурсов (например, привязки к Service
s, регистрировать приемники и т.д.), чтобы убедиться, что они были правильно приобретены до того, как они были необходимы и выпущены (и не просочились), когда они больше не нужны.
Ответ 2
То, что вы говорите, правильно. В большинстве случаев вы захотите зарегистрироваться в onResume()
и отменить регистрацию в onPause()
. Если вы используете onCreate()
и onDestroy()
, вы все равно будете регистрироваться на обновления, когда будете приостановлены, что является плохим гражданином. Если вы зарегистрируетесь в onCreate()
и отмените регистрацию в onPause()
, когда вы возобновите задачу, регистрация исчезнет, что почти наверняка не то, что вы хотите.