使用作业计划程序管理定期任务?

时间:2017-02-24 20:57:39

标签: android alarmmanager android-alarms job-scheduling android-api-levels

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

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

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

我尝试使用的内容:

1)我想为api< 21使用广播接收器,为api> = 21使用作业调度器。 对于作业调度程序,我无法设置需求可用网络并同时定期作业,因为这种方式在句点结束后运行是否满足要求。

2)我尝试在当前服务结束后将作业服务设置为下一个作业,但应用程序运行时好像该部分代码不存在(只运行一次)

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

如果有人可以指导我更好地处理这个问题,我会非常感激,因为我花了很长时间试图解决这个问题。

1 个答案:

答案 0 :(得分:1)

我会推荐一个名为android-job的Evernote图书馆。它处理在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();