Android工作管理器最小间隔解决方法



我正在使用工作管理器在后台运行服务,文档的最小间隔是15分钟,但我希望间隔为2分钟。

我试过这个代码,它在安卓工作室调试时工作,每两分钟正常运行一次,但一旦我拔下电缆,或直接通过apk部署它,它只运行一次并停止。

在主活动onCreate/onResume:中

OneTimeWorkRequest oneTimeRequest = new OneTimeWorkRequest.Builder(CallAndSmsWork.class).addTag(TAG).setInitialDelay(15, TimeUnit.SECONDS).build();
WorkManager.getInstance(getApplicationContext()).enqueueUniqueWork("CallnSms", ExistingWorkPolicy.REPLACE, oneTimeRequest);

在CallAndSmsWork服务的DoWork方法的末尾:

OneTimeWorkRequest oneTimeRequest = new OneTimeWorkRequest.Builder(CallAndSmsWork.class).setInitialDelay(120, TimeUnit.SECONDS).addTag(TAG).build();
WorkManager.getInstance(getApplicationContext()).enqueueUniqueWork("CallnSms", ExistingWorkPolicy.REPLACE, oneTimeRequest);

有没有我做错了什么,或者有任何其他选择可以让服务每两分钟正常运行一次?

附言:我在安卓10上,一加6t

对于2分钟的间隔,您可以使用周期性的可运行程序,比如:

private val runnable = object  : Runnable {
val periodInMillis = 2 * 60 * 1000L
override fun run() {
Log.d(DEBUG_TAG,"Runnable scheduled")
// Do stuff
mHandler?.postDelayed(this,periodInMillis)
}
}

并将其发送到处理程序线程:

//Threading madness
private var mThread: HandlerThread? = null
private var mHandler: Handler? = null

您无法初始化:

//Prepare Thread
if (mThread == null) {
mThread = HandlerThread("HeartBeatThread", Process.THREAD_PRIORITY_BACKGROUND)
mThread!!.start()
}
if (mHandler == null) mHandler =
Handler(mThread!!.looper) //Blocks until looper is prepared, which is fairly quick
mHandler!!.post(runnable)

这样,您就有了一个任务,该任务将自己排队,每2分钟运行一次。这可能是Doze模式的问题,也与Android处理电池节省模式的方式有关。为此,我想你可以拿起一把锁。

最新更新