震惊!他竟然为了这个功能放弃了 5.0 以下的用户!

2017-02-07  本文已影响202人  葉華千羽

JobScheduler 是一个新特性,用于实现周期性或定时运行的,且对具体运行时间点要求不高的后台任务,仅兼容 API level 21 以上。

JobScheduler 提供的功能其实在以往的系统上完全可以通过广播加服务的方式实现,但它的可贵之处有二:

对于诸如每周清理缓存、手机闲置一分钟后清理后台应用、添加了新联系人时同步到服务器之类定时或者周期运行,而且早一点晚一点都不要紧的后台工作,实现起来可是轻松极了。

1. 实现 JobService

第一步,决定任务被触发时要做什么。
首先继承 JobService 类,有两个抽象方法必须实现:

@Override
public boolean onStartJob(JobParameters params) {
    return false;
}

@Override
public boolean onStopJob(JobParameters params) {
    return false;
}

params 参数中保存着任务 ID 和配置任务时携带的额外信息,用于区分不同的任务。

1.1. onStartJob()

任务启动时被调用,在这时执行具体任务内容。方法返回值分两种情况:

jobFinished 方法的第二个参数指是否需要重新把这个任务加入计划中,可以理解为任务执行失败了,值为 true 时会启动任务重试,具体重试机制在下文详述。

需要注意的是这个方法是在应用的主线程执行的,因此平时开发时需要注意的问题在这里也适用。

1.2. onStopJob()

任务执行完毕,被取消或者没有满足运行条件而被放弃时调用,在这个方法内做收尾善后工作。方法返回值同样分为两种情况:

不管返回值如何,这个方法被调用的时候都应该停止目前正在执行的工作。

1.3. 举个例子

private boolean stillRunning;

@Override
public boolean onStartJob(final JobParameters params) {
    new Thread(() -> {
        PersistableBundle bundle = params.getExtras();
        int userId = bundle.getInt(KEY_PARAM_USER_ID);

        stillRunning = true;
        while (stillRunning) {
            sendSpam(userId);
        }
    }).start();
    return true;
}

@Override
public boolean onStopJob(JobParameters params) {
    stillRunning = false;
    return false;
}

JobService 写完后在清单文件中注册,声明 android.permission.BIND_JOB_SERVICE 权限即可。

<service
            android:name=".service.MyJobService"
            android:permission="android.permission.BIND_JOB_SERVICE"
            android:exported="true"/>

2. JobInfo.Builder

决定好了任务怎样执行,接下来该决定任务何时执行了。JobScheduler 使用 JobInfo 类来描述任务触发的种种条件, JobInfo 实例使用建造者模式来初始化。

2.1. 条件限制

需要注意的是以下条件都是严格限制的,如果条件一直没有被满足,任务就一直不会执行。如果希望即使条件没有满足也在某个时间点执行任务,则需要配合下文中的超时强制执行功能使用。

2.2. 触发条件

以下触发条件只能粗略限制执行时机,实际执行的时间点还是要依靠系统调度的,并不能保证条件满足了就会立刻执行。

2.3. 其他设置

2.4. 当然,

完全没有限制是绝对不可以的,源码里的注释激烈地吐槽了这一点:

// Allow jobs with no constraints - What am I, a database?

『你拿我当什么了?』

3. 一切准备停当

最后使用 Context.getSystemService(Context.JOB_SCHEDULER_SERVICE) 拿到 JobScheduler 实例,调用它的 schedule(JobInfo) 方法,就可以安静等待任务被执行了。

上一篇 下一篇

猜你喜欢

热点阅读