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的库也不会被允许允许。

0 0
原创粉丝点击