jus*_*oob 13 android android-jobscheduler
我的应用程序使用此经典模式来安排定期任务:
AlarmManager(通过setExactAndAllowWhileIdle(),因为即使在Doze中也必须关闭)设置确切的警报IntentService从onReceive()通过WakefulBroadcastReceiver.startWakefulService()onHandleIntent()并WakefulBroadcastReceiver.completeWakefulIntent()在完成后打电话.今天我将targetSdkVersion更新为26,并面临着WakefulBroadcastReceiver被弃用的可怕事实.
我立即去阅读API文档,发现以下内容:
从Android O开始,后台检查限制使这个类不再普遍有用.(从接收广播开始提供服务通常是不安全的,因为您无法保证您的应用程序此时处于前台,因此可以这样做.)相反,开发人员应该使用
android.app.job.JobScheduler安排一项工作,这并不要求应用程序在执行此操作时保持唤醒锁定(系统将负责为该作业保持唤醒锁定).
这对我来说有点令人困惑,我真的不明白为什么AlarmManager.setExactAndAllowWhileIdle()不能让设备保持清醒状态的目的是什么.
因为我看到我无法设置运行作业的确切时间JobScheduler,只有条件(例如网络类型或充电状态)所以我不知道该怎么做.
我想到了
使用AlarmManager和JobScheduler在一起
设置闹钟(带setExactAndAllowWhileIdle())并JobScheduler立即开始作业(通过)onReceive().既然JobScheduler提供了WakeLock,WakefulBroadcastReceiver就不需要了.
(这有意义吗?)
要么
WakefulBroadcastReceiver,尽管被弃用.我非常感谢你对此事的任何建议.
k3b*_*k3b -1
在 android-o 及更高版本中,您可以定义一个没有 Alarmmanager 的重复任务,如下所示:
// schedule the start of the service "TestJobService" every 10 - 30 minutes
public static void scheduleJob(Context context) {
ComponentName serviceComponent = new ComponentName(context, TestJobService.class);
JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent);
builder.setMinimumLatency(10 * 60 * 1000); // wait at least
builder.setOverrideDeadline(30 * 60 * 1000); // maximum delay
JobScheduler jobScheduler = context.getSystemService(JobScheduler.class);
jobScheduler.schedule(builder.build());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
692 次 |
| 最近记录: |