Как проверить, запущен ли сервис Android - PullRequest
0 голосов
/ 10 февраля 2019

Этот вопрос похож на Как проверить, работает ли служба на 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это ресурсоемкий и неэффективный цикл для запуска подобных сервисов, а также потому, что в документации сказано: «Примечание: этот метод предназначен только для отладки или реализации пользовательских интерфейсов типа управления сервисами».Это не предназначено для контроля потока!

Что такое элегантный / эффективный способ проверить, запущена ли уже служба?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...