Информация о состоянии фоновой службы Android - PullRequest
0 голосов
/ 14 декабря 2010

У меня есть действие, которое контролирует запуск и остановку фоновой службы через.нажатие кнопки.Когда служба не запущена, кнопка показывает «START SERVICE», а когда служба запущена, кнопка «STOP SERVICE».Логика того, что должно происходить при нажатии кнопки, переключается таким же образом (если служба не запущена, мы запускаем ее и привязываем к ней по нажатию кнопки, и мы останавливаем ее и отменяем привязку, если служба запущена).

Пожалуйста, ознакомьтесь с приведенной ниже выдержкой из кода для получения дополнительной информации.

Связывание и отмена привязки

В то время как в настоящее время обслуживание может быть остановлено только черезкнопка STOP SERVICE, я отменяю привязку сервиса в onPause и перевязываю его в onResume.Имеет ли это смысл?Методы жизненного цикла onPause и onResume вызываются довольно часто, поэтому это приводит к большим накладным расходам на связывание и открепление, но поскольку onPause всегда вызывается до того, как приложение может быть уничтожено, я думаю, что это лучшее место для освобождения привязок службы и предотвращения утечек.

кнопка BACK

Я также не уверен, что делать при нажатии кнопки BACK.Должна ли служба оставаться в фоновом режиме при нажатии кнопки НАЗАД (то же самое, что и в приложении Android Music)?Если да, каков будет правильный способ сохранить информацию о том, что служба запущена (поскольку onSaveInstanceState не вызывается при нажатии кнопки BACK, мне интересно, каков был бы самый чистый способ сохранить состояние приложения -в моем случае это логическая переменная isServiceRunning)?Мне нужна эта информация, чтобы установить правильный текст на кнопке «Пуск / Стоп» (относительно состояния фоновой службы), когда действие будет начато снова.Одной из возможных альтернатив также будет обеспечение нормального завершения действия без сохранения какой-либо информации о состоянии службы (isServiceRunning).Я мог получить эту информацию в onCreate из ActivityManager, где я мог бы запросить запущенные сервисы.

С другой стороны, если служба должна быть остановлена ​​нажатием кнопки НАЗАД, где я должен осуществить остановку службы?onDestroy был бы естественным ответом на этот вопрос, но я сталкиваюсь с проблемами, так как onDestroy также вызывается при перезапуске активности (например, при изменении ориентации), и я не хочу останавливать службу в этом случае.

    public class ServiceController extends Activity {
 public void onStartClick(View v) {
  if (!isServiceRunning) {
   button.setText("STOP");
   isServiceRunning = true;
   startService(...)
   bindService(...)
  } else {
   button.setText("START");
   isServiceRunning = false;
   unbindService(...)
   stopService(...)
  }
 }

 @Override
 protected void onResume() {
  super.onResume();
  if (isServiceRunning) {
   button.setText("STOP");
   bindService(...);
  }
 }

 @Override
 protected void onPause() {
  super.onPause();
  if (mBoundAccService != null) {
   unbindService(...);
  }
 }

 @Override
 protected void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  if (savedInstanceState != null) {   
   isServiceRunning = savedInstanceState.getBoolean(ID_SERVICE_RUNNING);
  }
 }

 @Override
 protected void onSaveInstanceState(Bundle outState) {
  super.onSaveInstanceState(outState);
  outState.putBoolean(ID_SERVICE_RUNNING, isServiceRunning);
 }
    } 

1 Ответ

0 голосов
/ 15 декабря 2010

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

Это то, что сделал мое приложение.

Когда пользователь выбрал Начать с (очевидно) действия, служба запустилась со следующим кодом.

startService (new Intent (this, MyService.class));

И когда пользователь выбирает Stop (та же кнопка или другая кнопка)

stopService (новый Intent (this, MUMService.class));

В классе Service я реализовал методы onStart и onDestroy для управления процессом обслуживания.

Я не переопределил кнопку возврата (это не рекомендуется для Android), но если вам нужно ... вот код (в вашей деятельности)

@ Override

public boolean onKeyDown (int keyCode, событие KeyEvent) {

if (keyCode == KeyEvent.KEYCODE_BACK) {

...