Остановка и запуск службы на основе состояния приложения - PullRequest
6 голосов
/ 28 октября 2010

У меня есть служба, которая отслеживает местонахождение пользователя. В настоящее время Служба загружается при запуске приложения и останавливается при его завершении. К сожалению, если пользователи хранят приложение в фоновом режиме, Сервис никогда не останавливается и не разряжает батарею.

Я бы хотел, чтобы Служба остановилась, когда мое приложение находится не на переднем плане. Я надеялся, что класс Application позволит мне переопределить обработчики onPause и onResume, но он не имеет их. Есть ли другой способ, которым я могу сделать это?

Ответы [ 8 ]

5 голосов
/ 04 декабря 2010

Я еще не проверял это, но похоже, что если вы используете Context#bindService() (вместо Context#startService()), служба должна остановиться, когда с ней больше не связаны никакие действия.(см. Жизненный цикл обслуживания ).

Затем используйте onPause() / onResume() в каждом действии для привязки / отмены привязки к службе.

В качестве альтернативы, вы можете добавить в свой сервис пару методов, которые сообщают ему запускпрекратить прослушивать обновления местоположения и вызывать его из каждого вида деятельности onResume() / onPause().Служба все еще будет работать, но обновление местоположения не приведет к разрядке аккумулятора.

1 голос
/ 08 декабря 2010

Читая все приведенные выше ответы, я бы предложил Просто добавьте логический глобальный флаг для каждого действия и поместите его в свой onResume & onPause, а также при запуске действия Что-то вроде этого

public void onPause()
{
super.onPause();
activity1IsResumed = true;
}

и то же самое для onResume

и аналогично при запуске новой операции

startActivityForResult(myintent ,0);
activity2IsResumed = true;
activity1IsResumed = false;

тогда в вашем Сервисе просто отметьте

if(activity1IsResumed || activity2IsResumed || activity3IsResumed)
{
//your logic
}
else
{
//another logic
//or dont run location tracker
}

и все готово!

0 голосов
/ 24 марта 2014

Попробуйте использовать метод Bound Services для достижения этой цели.

Связанные услуги | Разработчики Android

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

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

Похоже, что настоящая проблема в том, как остановить службу, только когда вы переходите к занятию, которое не принадлежит вам?Одним из способов будет использование метода onPause для прекращения действия.Сделайте это для всех ваших действий.Затем переопределите ваш метод startActivity.И здесь сделайте условный тест, чтобы подтвердить, что вы целенаправленно переходите к одному из своих.Если для вас установлен флаг true.

Теперь вернитесь к переопределенному методу на паузу.И только остановите ваш сервис, если флаг не равен true.Установите флаг в ложь.

Все события, которые удаляются, закроют ваш сервис.Навигация по своему усмотрению не изменится.

Выполните переопределение в базовом классе, которое расширяет все ваши действия.

Пишите в мой андроид.Позже выложу ezaple.

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

Я бы предложил переопределить методы onPause / onReume, как говорили другие. Не зная больше о потоке вашего приложения и взаимодействиях между операциями, я не могу дать гораздо больше информации, кроме догадок.

Однако, если ваши действия будут постоянными, моя рекомендация будет заключаться в том, чтобы лучше использовать Интенты при переключении между действиями.

Например, каждое действие должно иметь логический флаг «перехода». Поэтому, когда вы переходите от одного занятия к другому, вы настраиваете дополнительное намерение:

intent.putExtra("transition",true);

Далее в получающей деятельности: (в onCreate)

intent.getBooleanExtra("transition",false);

Таким образом, для каждого запускаемого действия вы можете узнать, пришло ли оно из другого действия или оно было запущено из панели запуска домашнего экрана. Таким образом, если он получает истинный переход, то onPause НЕ должно останавливать службу - это означает, что вы вернетесь к предыдущему действию после его возвращения. Если он не получает никаких дополнительных «переходов» или ложных переходов, то вы можете смело предположить, что под ним нет никаких действий, ожидающих смены текущего.

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

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

Создайте методы registerActivity() и unRegisterActivity() в вашем объекте Application и реализуйте первый метод во всех ваших действиях onResume(), а второй в действиях onPause().

Первый метод добавляет действие к экземпляру List<Activity> в объекте приложения, unRegisterActivity() проверяет размер списка при каждом вызове if==0 stopService();.

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

Я не пробовал этот подход, но я думаю, что вы можете переопределить домашний ключ устройства Android с помощью KeyEvent.KEYCODE_HOME, и вы можете использовать stopService(Intent), чтобы остановить свою службу, а когда приложение возобновится, вы можете написать startService(Intent) метод onResume () вашей Деятельности.

Таким образом, я думаю, что ваш сервис остановится, только когда пользователь явно нажмет кнопку «Домой», чтобы перевести приложение в фоновый режим, а не когда он переключится с одного действия на другое.

0 голосов
/ 28 октября 2010

Вы должны переопределить методы onPause и onResume в Activity . Если у вас есть несколько действий, вы можете захотеть иметь общий базовый класс для них и поместить логику запуска / остановки в базовый класс.

...