Этот вопрос похож на Как проверить, работает ли служба на Android? , но поскольку вопрос старый и ответы на него устарели или не работают должным образом.Таким образом, отдельный вопрос.
У меня есть реализация, которая запускает службу при завершении загрузки, но я также хочу запустить службу в onCreate of MainActivity, если служба не была запущена раньше.
ЗДЕСЬ ЧТО Я ПОПРОБОВАЛ
1.Извлеките статическое логическое значение, чтобы получить состояние службы, как показано ниже.
MyService.kt
class MyService : Service() {
override fun onCreate() {
super.onCreate()
isServiceStarted = true
}
override fun onDestroy() {
super.onDestroy()
isServiceStarted = false
}
companion object {
var isServiceStarted = false
}
}
MainActivity.kt
class MainActivity : AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val serviceStarted = MyService.isServiceStarted
if (!serviceStarted) {
val startMyService = Intent(this, MyService::class.java)
ContextCompat.startForegroundService(this, startMyService)
}
}
}
, но я скорообнаружил, что onDestroy
не всегда вызывается при уничтожении службы, в результате чего моя статическая логическая переменная (isServiceStarted) остается истинной, когда в действительности она была уничтожена.
2.Функция дляcheck
fun isMyServiceRunning(serviceClass : Class<*> ) : Boolean{
var manager = getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
for (service in manager.getRunningServices(Integer.MAX_VALUE)) {
if (serviceClass.name.equals(service.service.className)) {
return true
}
}
return false
}
Вызов
isMyServiceRunning(MyService::class.java)
Проблемы с этим подходом включают: - getRunningServices устарела с Android O (API 27), - Itэто ресурсоемкий и неэффективный цикл для запуска подобных сервисов, а также потому, что в документации сказано: «Примечание: этот метод предназначен только для отладки или реализации пользовательских интерфейсов типа управления сервисами».Это не предназначено для контроля потока!
Что такое элегантный / эффективный способ проверить, запущена ли уже служба?