Android 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",oneTimeRequest);

是否有我做错的事情,或者是否有其他选择可使服务每两分钟正确运行一次?

P.S .:我在android 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分钟运行一次任务。问题可能出在打mode模式,与Android处理省电模式有关。为此,我猜你可以拿起一把锁。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...