У меня есть действие, которое контролирует запуск и остановку фоновой службы через.нажатие кнопки.Когда служба не запущена, кнопка показывает «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);
}
}