APP开发实战164-Evernote的JobScheduler方案
来源:互联网 发布:董成鹏抄袭知乎 编辑:程序博客网 时间:2024/05/21 14:53
34.13.2 JobScheduler的替代方案
前面提到,使用JobScheduler时,即使执行任务的条件不满足,任务也会被执行;为了规避这个缺陷,可以使用Evernote提供的库让APP定期执行任务,以下是具体的实现方式。
在build.gradle文件中增加库的依赖:
dependencies {
…
compile 'com.evernote:android-job:1.1.8'
}
需要从库提供的类派生几个类:
public class DemoJobCreator implementsJobCreator {
@Override
public Job create(String tag) {
switch (tag) {
case DemoSyncJob.TAG:
return new DemoSyncJob();
default:
return null;
}
}
}
public class DemoSyncJob extends Job {
public static final String TAG ="job_demo_tag";
@Override
@NonNull
protected Result onRunJob(finalParams params) {
if (params.isPeriodic()) {
PendingIntent pendingIntent =PendingIntent.getActivity(getContext(), 0, new Intent(getContext(),MainActivity.class), 0);
Notification notification =new NotificationCompat.Builder(getContext())
.setContentTitle("JobDemo")
.setContentText("Periodic job run")
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setSmallIcon(R.drawable.ic_notifications_black_24dp)
.setShowWhen(true)
.setColor(Color.GREEN)
.setLocalOnly(true)
.build();
NotificationManagerCompat.from(getContext()).notify(newRandom().nextInt(), notification);
EamLog.v("job","isPeriodic==true");
}else {
EamLog.v("job","isPeriodic==false");
}
return Result.SUCCESS;
}
}
需要在Application类中创建类的实例:
public class EamApplication extendsApplication {
private static Context sContext;
@Override
public void onCreate() {
super.onCreate();
…
JobManager.create(this).addJobCreator(new DemoJobCreator());
}
}
//Job的任务Id
private int mLastJobId;
private JobManager mJobManager;
//初始化JobManager对象
public void initVariables() {
…
mJobManager = JobManager.instance();
}
//设置执行此任务需满足的条件、间隔时间和关机重启后是否继续执行
public static void scheduleJob(){
mLastJobId = newJobRequest.Builder(DemoSyncJob.TAG)
.setRequiredNetworkType(JobRequest.NetworkType.CONNECTED)
.setRequiresDeviceIdle(true)
.setRequiresCharging(true)
.setPeriodic(JobRequest.MIN_INTERVAL)
.setPersisted(true)
//设置只有此任务的执行条件被满足时,才执行此任务
.setRequirementsEnforced(true)
.build()
.schedule();
}
//取消Job
private void cancelJob(){
mJobManager.cancelAll();
}
Evernote提供了setRequirementsEnforced函数,让使用者设置是否只有任务执行的条件都满足了,系统才执行任务。
在Android7.0中,Job循环执行时,最小的间隔时间是15分钟,所以Evernote为了兼容Android7.0,设计任务循环执行的最新间隔时间也是15分钟。
在Evernote提供的源码(JobRequest.java)中,可以看到如下说明:
/**
* The minimum interval of a periodicjob. Specifying a smaller interval will result in an exception.
* This limit comes from the {@codeJobScheduler} starting with Android Nougat.
*/
public static final long MIN_INTERVAL =TimeUnit.MINUTES.toMillis(15);
使用这个库时,在混淆文件中要增加如下代码:
-dontwarn com.evernote.android.job.gcm.**
-dontwarncom.evernote.android.job.util.GcmAvailableHelper
-keep public classcom.evernote.android.job.v21.PlatformJobService
-keep public classcom.evernote.android.job.v14.PlatformAlarmService
-keep public classcom.evernote.android.job.v14.PlatformAlarmReceiver
-keep public classcom.evernote.android.job.JobBootReceiver
-keep public classcom.evernote.android.job.JobRescheduleService
34.13.3 注意事项
1上述两种方案都必需在Android5.0(API 21)及以上的系统中使用。
2从Android6.0开始,为了省电,Android实现了低耗电模式:通过在设备长时间处于闲置状态时推迟应用的后台 CPU 和网络 Activity 来减少电池消耗;在此模式下系统不允许运行 JobScheduler。
Evernote提供的库继承了JobScheduler功能类,所以在低耗电模式下,Evernote的库也不会被允许允许。
- APP开发实战164-Evernote的JobScheduler方案
- APP开发实战163-JobScheduler介绍
- APP开发实战146-减少预置图片的方案
- APP开发实战10-APP数据同步方案
- APP开发实战175-针对Android7.0及更高版本的后台优化方案
- APP开发实战9-API接口安全方案
- Evernote CTO:打造优秀APP的五个建议
- APP开发实战70-服务的生命周期
- APP开发实战159-广播的安全性
- APP开发实战161-图片格式的选择
- APP开发实战6-APP的切图工作
- APP开发实战7-APP的尺寸标注工作
- APP开发实战11-APP登录状态的维持
- APP开发实战168-APP快捷图标的功能设计
- APP开发实战172-统计APP启动时间的方法
- Hybrid App开发实战
- hybrid app开发实战
- Hybrid App开发实战
- 利用STL中的partition完成快排
- MySQL mysqldump数据导出详解
- APP开发实战163-JobScheduler介绍
- C#
- Android调试启动URL
- APP开发实战164-Evernote的JobScheduler方案
- android 用命令来提高编译速度
- java web开发(二) 接口开发
- 腾讯大数据面试及参考答案[2017]
- 最简单实现从相册和拍照中获取图片
- B1003. 我要通过!(20')
- Discuz!开发之写入文件缓存
- Ubuntu 14.04 安装nVidia驱动后不能进入图形界面的恢复过程
- jupyter notebook默认目录的设置