postDelayed()在带有START_STICKY和startForeground的Android服务中不起作用

时间:2018-09-17 07:31:18

标签: android service timer postdelayed

我有服务

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 :(得分:0)

您编写的内容只能运行一次,您必须再次从Handler撤回Runnable才能使其定期运行

尝试

final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            this@BusLocationService.startPermissionActivity()
             handler.postDelayed(this,60000);
        }
    }, 60000);