【问题标题】:Daily Job on a specific time for Android 8.0+Android 8.0+ 特定时间的每日作业
【发布时间】:2018-08-28 09:50:01
【问题描述】:

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

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

WorkManagerPeriodicWorkRequest 不允许您设置开始工作的时间。我考虑创建一个延迟的OneTimeWorkRequest 并在它运行后安排下一个,但没有什么能确保工作能在我想要的时间运行。

Evernote 的 Android-Job 库与 DailyJob 也存在问题 (https://github.com/evernote/android-job/issues/318)。

欢迎提出任何建议/想法。

【问题讨论】:

  • 如果您希望您的工作在 android 8 中的特定时间运行,请将 alarmManager 与 setInexact 结合使用。
  • @Dr.aNdRO 我试过了,但是当你“强制停止”应用程序时,待处理的意图消失了,应用程序不会唤醒。
  • 当用户在本地设置时,您可以使用 FCM 进行调度,对吗?只有在这种情况下,如果您的目标 >=8,您将准时收到警报。由于 WorkManager 不会在那个特定时间设置警报,而是在它附近。
  • 只没有涉及到服务器。仅在设备上运行的代码。 FCM 不是一种选择。
  • 检查这个项目它做的一样。 github.com/cyph3rcod3r/Alliance 没有 FCM 并针对 android 8

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以只使用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>()
     firstWorkRequest.withInitialDelay(24, TimeUnit.HOURS)
     WorkManager.getInstance().enqueue(firstWorkRequest)
    

    因此,您会在所需的时间得到看起来像 PeriodicWorkRequest 的东西。

    【讨论】:

      【解决方案3】:

      您是否尝试过在 WorkManager 中使用链式任务。首先调度 OneTimeWorkRequest,然后将其与 PeriodicWorkRequest 链接。喜欢:

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

      其中 workAOneTimeWorkRequestworkBPeriodicWorkRequest

      【讨论】:

      • 我知道 API。您将如何使用它来设置特定时间?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多