postDelayed () не работает в службе Android с START_STICKY и startForeground - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть услуга

class BusLocationService : Service()

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

override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
    if (intent.action == Constants.ACTION.STARTFOREGROUND_ACTION) {
        registerChannel();
        showNotification();
    }
    return START_STICKY
}

private fun showNotification() {
    val notification = ...
    startForeground(Constants.NOTIFICATION_ID.FOREGROUND_SERVICE,
            notification)
}

Он должен периодически (раз в минуту) выполнять некоторый код, но это не так. Он делает это только изредка (вероятно, когда основное действие видно).

private fun startPermissionActivity() {
    android.os.Handler().postDelayed(
        {
            this@BusLocationService.startPermissionActivity()
        },  60000)
}

Это postDelayed ненадежно? Или проблема в другом? Что еще может заставить сервис пропустить таймер?

Обновление

При тестировании в эмуляторе дома (видна активность) я вижу, что код выполняется раз в минуту. Проблема возникает на реальном устройстве (OnePlus 3T) и когда активность находится в фоновом режиме. Иногда это работает (редко), иногда (часто) это не работает.

1 Ответ

0 голосов
/ 17 сентября 2018

То, что вы написали, будет запускаться только один раз, вы должны снова вызвать Handler из Runnable, чтобы оно периодически запускалось

попробуйте это

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            this@BusLocationService.startPermissionActivity()
             handler.postDelayed(this,60000);
        }
    }, 60000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...