Привязка к службе в onCreate () или в onResume () - PullRequest
21 голосов
/ 21 февраля 2010

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

Ответы [ 2 ]

45 голосов
/ 21 февраля 2010

Я бы обычно рекомендовал делать это либо в onCreate() / onDestroy(), либо в onStart() / onStop(), в зависимости от требуемой семантики:

  • Если ваш Activity хочет взаимодействовать с Service все время его работы (например, может быть, он может получить некоторые данные из сети для вас и вернет данные, когда вы будете готовы, и вы захотите чтобы это происходило в фоновом режиме, поэтому, если пользователь вернется, у вас будут готовы данные), тогда, вероятно, уместно будет onCreate() / onDestroy(). Обратите внимание, что семантика здесь заключается в том, что все время, в течение которого ваш Activity выполняется, ему требуется Service, поэтому, если этот Service выполняется в другом процессе, вы увеличили его вес и повысили его вероятность для него быть убитым в фоновом режиме.

  • Если ваш Activity заинтересован только в том, чтобы работать с Service, пока он виден, тогда onStart() / onStop() подходит. Это означает, что ваш Activity отсоединится от Service, когда пользователь покинет его (и он больше не виден), и подключится обратно в следующий раз, когда возврат будет возобновлен и возобновлен.

Я бы вообще не рекомендовал делать связывание / открепление в onResume() и onPause(). Как правило, они не будут значительно уменьшать количество, которое вы используете Service (и, следовательно, ваши накладные расходы), и фактически, потому что пауза и возобновление происходят при каждом переходе активности, это путь кода, который вы хотите сохранить как можно более легким , Выполнение этого может привести к другим неожиданным негативным последствиям: например, если несколько Activity в вашем приложении привязаны к одному и тому же Service, при переходе между двумя этими действиями Service также может быть уничтожено и воссоздано как текущий Activity ставится на паузу до возобновления следующего.

Также эти пары (onCreate() / onDestroy(), onStart() / onStop(), onPause() / onResume()) предназначены для использования в качестве правильных пар для получения и последующего освобождения ресурсов (таких как привязка к Service s, регистрация получателей и т. Д.), Чтобы гарантировать, что они правильно получены до того, как они понадобятся, и будут выпущены (и не просочились), когда они больше не нужны.

0 голосов
/ 21 февраля 2010

То, что вы говорите, правильно. В большинстве случаев вы захотите зарегистрироваться в onResume() и отменить регистрацию в onPause(). Если вы используете onCreate() и onDestroy(), вы все равно будете регистрироваться для получения обновлений, когда вы приостановлены, что является плохим гражданином. Если вы зарегистрируетесь в onCreate() и отмените регистрацию в onPause(), то при возобновлении задачи регистрация пропадет, что почти наверняка не то, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...