在PeriodicTimeRequest
中,最小周期性时间为15分钟。我想将其从15分钟减少到15分钟以下。我该怎么做?
答案 0 :(得分:0)
您不能更改15分钟的最短时间。如果可以将其更改为小于该值,则将其称为最小值。 根据您的需要,尝试使用警报管理器或FCM。 有关更多详细信息,请参见以下链接:https://developer.android.com/training/efficient-downloads/regular_updates
答案 1 :(得分:0)
否,您不能将时间减少到少于PeriodicWorkRequest.MIN_PERIODIC_INTERVAL_MILLIS
,即 15分钟
由于节省了电池,所以这是系统的局限性,没有黑客。
答案 2 :(得分:0)
我们有办法减少15分钟的定期运行时间。但是您不能使用PeriodicWorkRequest。创建具有初始延迟的OneTimeWorkRequest,并在worker内部工作结束时调用self。如果需要,创建 backgroundExecutor.execute {}并从内部进行调用以进行异步调用。意味着调用self的worker将不会被终止,或者onStopped()不会被调用。
ExistingWorkPolicy.REPLACE |可能需要保留KEEP,具体取决于您的需求。
答案 3 :(得分:0)
一个简单的答案是否,您不能将时间减少到少于MIN_PERIODIC_INTERVAL_MILLIS,该时间硬编码为15分钟。
但是,您可以比MIN_PERIODIC_INTERVAL_MILLIS早15分钟来测试PeriodicWorkRequest。
为此,您需要WorkManagerTestInitHelper
中的androidx.work.testing
。
首先在您的应用或模块的build.gradle文件中添加以下依赖项:
//Current stable release is 2.3.4
androidTestImplementation "androidx.work:work-testing:2.3.4
接下来,您需要使用setPeriodDelayMet
可用的TestDriver
方法,该方法可以用来指示一个间隔已完成,并且比MIN_PERIODIC_INTERVAL_MILLIS(15分钟)要早执行PeriodicWorkRequest。
示例代码:
@Test
public void testPeriodicWork(Context context) throws Exception {
// Setup input data
Data input = new Data.Builder().put(KEY_1, 1).put(KEY_2, 2).build();
// Create periodic work request
PeriodicWorkRequest request = new PeriodicWorkRequest.Builder(MyWorker.class, 15, TimeUnit.MINUTES)
.setInputData(input)
.build();
// Enqueue periodic request
WorkManager.getInstance(context).enqueueUniquePeriodicWork(WORKER_TAG, ExistingPeriodicWorkPolicy.REPLACE, request);
// Initialize testDriver
TestDriver testDriver = WorkManagerTestInitHelper.getTestDriver();
// Tells the testing framework the period delay is met, this will execute your code in doWork() in MyWorker class
testDriver.setPeriodDelayMet(request.getId());
}
中找到有关测试PeriodicWorkRequest的更多信息。
在https://developer.android.com/reference/androidx/work/testing/WorkManagerTestInitHelper和https://developer.android.com/reference/androidx/work/testing/TestDriver上了解有关测试WorkManager的更多信息
答案 4 :(得分:0)
如果间隔时间少于15分钟。我会创建多个任务,例如:
if (PublicStaticData.systemSet.rescueuploadinterval <= 15) {
WorkManager.getInstance(this).cancelAllWorkByTag("uploadLocationWork")
val tasks = 15 / PublicStaticData.systemSet.rescueuploadinterval
for (taskNo in 0 until tasks) {
val uploadLocationWork = PeriodicWorkRequestBuilder<UploadLocationWork>(
PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
.addTag("uploadLocationWork")
.setInitialDelay((PublicStaticData.systemSet.rescueuploadinterval * taskNo).toLong(), TimeUnit.MINUTES)
.build()
WorkManager.getInstance(this).enqueue(uploadLocationWork)
Log.e("jjj", "任务${taskNo}延迟${PublicStaticData.systemSet.rescueuploadinterval * taskNo}开始")
}
} else {
// 超过15分钟,正常用就行
WorkManager.getInstance(this).cancelAllWorkByTag("uploadLocationWork")
val uploadLocationWork = PeriodicWorkRequestBuilder<UploadLocationWork>(
PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
.addTag("uploadLocationWork")
.setInitialDelay(PublicStaticData.systemSet.rescueuploadinterval.toLong(), TimeUnit.MINUTES)
.build()
WorkManager.getInstance(this).enqueue(uploadLocationWork)
}
存在可接受的偏差。