Подтвердить что ты не робот

Привязка к службе в onCreate() или in onResume()

Я хочу знать, что является лучшим местом в Activity для привязки к сервису? Я видел примеры, сделанные в onResume(), а также в onCreate(). Я спрашивал себя, не помешает ли это в onCreate(), потому что в onPause() я буду отключать службу, поэтому я не получаю serviceConnectionLeak, если я оставлю действие. Теперь, если я нажму кнопку "Главная", а затем переключится на главный экран, Activity отменит связь с сервисом, когда я вернусь к Activity из диспетчера задач, тогда onCreate() не будет вызываться, и если код пытается доступ к функции из службы, я получу исключение NullPointerException. Если я свяжусь и отвяжу только в onResume() и onPause(), у меня нет этой проблемы. Я прав?

4b9b3361

Ответ 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(), когда вы возобновите задачу, регистрация исчезнет, ​​что почти наверняка не то, что вы хотите.