使用 Job Scheduler 管理周期性任务?

manage periodic tasks with job Scheduler?

基本上我想做的是,当有互联网连接时,然后从传感器收集值并安排下一次从传感器收集数据的时间,比方说 5 分钟(这个间隔取决于当前 activity:走路,运行...)。 5分钟后,系统检查是否有互联网连接:

-如果有则重复循环(收集,发送到服务器并安排下一次数据收集)

*如果没有,则下一次收集数据的时间安排在下一次有可用的互联网连接时

我尝试使用的是:

1) 我想为 api<21 使用广播接收器,为 api>=21 使用作业调度程序。 对于作业调度程序,我无法设置要求可用网络并同时使作业成为周期性的,因为这样无论是否满足要求,作业都会在周期结束后运行。

2) 我试图让作业服务在当前作业结束后设置下一个作业,但应用 运行 就好像那部分代码不存在一样(它只 运行一次)

3) 我试图以某种方式将作业调度程序与警报管理器结合起来,使作业调度程序管理网络需求,而警报管理器管理作业的周期性方面。但是我没有实现这个,我觉得这不是正确的方法。

如果有人能指导我找到更好的方法来处理这个问题,我将不胜感激,因为我花了很长时间试图解决这个问题。

我会推荐 Evernote 中的一个名为 android-job 的库。它处理在 21+、Firebase/GcmNetworkManager 或 AlarmManager 上选择 JobScheduler 以及各种其他事情的所有复杂性。它具有一组非常强大的功能,应该适合您的用例。

例如:

int jobId = new JobRequest.Builder(DemoSyncJob.TAG)
        .setExecutionWindow(30_000L, 40_000L)
        .setBackoffCriteria(5_000L, JobRequest.BackoffPolicy.EXPONENTIAL)
        .setRequiresCharging(true)
        .setRequiresDeviceIdle(false)
        .setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
        .setExtras(extras)
        .setRequirementsEnforced(true)
        .setPersisted(true)
        .setUpdateCurrent(true)
        .build()
        .schedule();