Android 8.0或更高版本的特定时间的每日工作

时间:2018-08-28 09:50:02

标签: android alarmmanager android-jobscheduler android-8.1-oreo android-workmanager

我一直在尝试找出如何使用任何后台任务API来创建工作请求,该工作请求每天在特定时间在运行Android 8.0+的设备上触发。 时间必须由用户在设备上本地设置(表示没有GCM)。

还有可能吗?带有AlarmManager的旧版设备可以产生奇迹,但是就我所知,在应用程序被强制停止时,所有待处理的意图都被清除了,所以现在不行了。

WorkManager的{​​{1}}不允许您设置开始工作的时间。我研究过创建延迟的PeriodicWorkRequest并计划下一个运行后的运行,但是没有什么可以确保这项工作能够按我希望的时间运行。

Evernote的OneTimeWorkRequest库也与Android-Jobhttps://github.com/evernote/android-job/issues/318)有关。

欢迎任何建议/想法。

3 个答案:

答案 0 :(得分:1)

您可以只使用sendEvent:来安排自身的副本,然后返回OneTimeWorkRequest

Result

使用以下命令开始第一个工作请求:

class TestWorker: Worker() {
   fun doWork(): Result {
     val nextWorkRequest = OneTimeWorkRequestBuilder<TestWorker>()
     nextWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
     WorkManager.getInstance().enqueue(nextWorkRequest)
     return Result.SUCCESS;
   }
}

因此,您得到的东西看起来像 val firstWorkRequest = OneTimeWorkRequestBuilder<TestWorker>() nextWorkRequest.withInitialDelay(24, TimeUnit.HOURS) WorkManager.getInstance().enqueue(firstWorkRequest) ,具有所需的时间。

答案 1 :(得分:0)

您尝试在WorkManager中使用链接的任务。首先安排 OneTimeWorkRequest ,然后将其与 PeriodicWorkRequest 链接。喜欢:

WorkManager.getInstance()
.beginWith(workA)
.then(workB) 

其中 workA OneTimeWorkRequest ,而 workB PeriodicWorkRequest

答案 2 :(得分:0)

新的PeriodicWorkRequests现在支持初始延迟。因此,您从用户那里获得了所需的时间,计算出userTime和Now之间的时差,然后设置延迟。 与AlarmManeger不同,它非常可靠。 唯一的问题是Android在找到最佳时机时解雇了Worker(没有其他工作要做),因此它的启动可能会稍有延迟(通常不超过几分钟)。