Как проверить, работает ли сервис на Android?
Как проверить, работает ли фоновая служба?
Я хочу, чтобы активность Android изменяла состояние службы — она позволяла мне включать его, если он выключен, и выключен, если он включен.
У меня была такая же проблема не так давно. Так как мой сервис был локальным, я просто использовал статическое поле в классе сервиса для переключения состояния, как описано здесь hackbod
РЕДАКТИРОВАТЬ (для записи):
Вот решение, предложенное hackbod:
Если ваш клиентский и серверный код является частью одного и того же .apk, и вы привязываетесь к сервису с конкретным намерением (которое указывает точный класс сервиса), то вы можете просто сделать так, чтобы ваш сервис установил глобальную переменную, когда он выполняет Ваш клиент может проверить.
У нас намеренно нет API, чтобы проверить, работает ли служба, потому что, почти всегда, когда вы хотите сделать что-то подобное, вы сталкиваетесь с условиями гонки в своем коде.
Я использую следующее изнутри деятельности:
И я называю это используя:
Это работает надежно, поскольку основано на информации о запущенных сервисах, предоставляемых операционной системой Android через ActivityManager # getRunningServices .
Все подходы, использующие события onDestroy или onSometing, или Binder, или статические переменные, не будут работать надежно, потому что как разработчик вы никогда не знаете, когда Android решает убить ваш процесс или какой из упомянутых обратных вызовов вызван или нет. Обратите внимание на столбец «killable» в таблице событий жизненного цикла в документации Android.
Вы ДОЛЖНЫ призвать startService() к тому, чтобы ваша служба была должным образом зарегистрирована, и передачи BIND_AUTO_CREATE не будет достаточно.
А теперь класс ServiceTools:
Небольшое дополнение это:
Моя цель — знать, запущен ли сервис без его фактического запуска, если он не запущен.
Вызов bindService или вызов намерения, которое может быть перехвачено службой, не является хорошей идеей, поскольку он запустит службу, если она не запущена.
Итак, как предположил miracle2k, лучше всего иметь статическое поле в классе обслуживания, чтобы знать, запущена служба или нет.
Чтобы сделать его еще чище, я предлагаю преобразовать службу в синглтон с очень и очень ленивым извлечением: т. Е. Вообще нет экземпляра синглтона например , через статические методы. Статический метод getInstance вашего сервиса / синглтона просто возвращает экземпляр синглтона, если он был создан. Но на самом деле он не запускает и не создает экземпляр самого синглтона. Служба запускается только обычными методами запуска службы.
Тогда было бы еще чище изменить шаблон проектирования синглтона, чтобы переименовать запутанный метод getInstance во что-то вроде isInstanceCreated() : boolean метода.
Код будет выглядеть так:
Это элегантное решение, но оно актуально только в том случае, если у вас есть доступ к классу обслуживания и только для классов, кроме приложения / пакета службы. Если ваши занятия находятся за пределами приложения / пакета службы, вы можете запросить ActivityManager с ограничениями, подчеркнутыми Питером-Яном Ван Робайсом.
Источник