首页 > 解决方案 > Android workmanager 最小间隔解决方法

问题描述

我正在使用 workmanager 在后台运行服务,文档的最小间隔是 15 分钟,但我希望有 2 分钟的间隔。

我试过这段代码,它在从 android studio 调试时工作,每两分钟正常运行一次,但是一旦我拔下电缆,或者直接通过 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);

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

PS:我是安卓10,一加6t

标签: androidandroid-workmanager

解决方案


对于 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 分钟运行一次。问题可能是打盹模式以及与 Android 处理节电模式的方式有关。为此,我猜你可以拿起一把锁。


推荐阅读