android - 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
解决方案
对于 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 处理节电模式的方式有关。为此,我猜你可以拿起一把锁。
推荐阅读
- unit-testing - 如何测试与数据库交互的函数?
- c# - Microsoft DB2 OLE DB Provider :A network library error has occurred (6): 句柄无效
- javascript - 带有 React-Query 的搜索框
- python - 如何更改 Pandas DataFrame 的列名?
- cs50 - 为什么说我的变量未定义?
- python - pywren 和 twint - Tweet 下载
- javascript - 从 querySelectorAll 中选择一个特定值并循环它们
- python-3.x - 在 for 循环中使用 Selenium Python 重复单击相同坐标
- flutter - external_app_launcher 重定向到 playstore
- python - zsh:1:在 Jupiter IPython 教程之后在 `}' 附近解析错误