【学习笔记】Google JobScheduler Demo的学习与运用

官方 DEMO

路径如下

sdk\sources\android-22\com\android\demo\jobSchedulerApp\

Demo 需求

JobShedule的出发点是提供省电场景给用户进行任务完成,目前主要场景如下
1.网络数据场景
2.充电场景
3.idle待机场景
4.固定周期场景

接下来我们已
充电下且网络为连接时的场景为例进行JobShedule的使用说明。

Demo中的源代码都是Google SDK自带的

核心设置参数代码如下

        // 设置最小的延迟时间
        builder.setMinimumLatency(1*1000);

        // 设置最大的延迟时间,一旦设置了这个属性,不管其他条件怎么样,jobinfo到了时间就一定会执行。
        builder.setOverrideDeadline(5*1000);

        // 设置在什么样的网络下启动jobinfo
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);

        // 设置设备需要在空闲的时候,是否启动job
        builder.setRequiresDeviceIdle(false);

        // 设置是否充电情况下调度
        builder.setRequiresCharging(true);

备注:上述的关系是与的关系,不是或的关系

场景条件达成回调接口如下


public class MyJobSchedulerService extends JobService{

    /**
     * 满足Job预设置条件下回调 
     */
    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        Log.d(Constant.TAG, "onStartJob: " + jobParameters.getJobId());
    }

    /**
     * 1.被CancleAll的时候回调
     * 2.不满足预设置条件的情况下回调
     */
    @Override
    public boolean onStopJob(JobParameters jobParameters) {
    }

}

重要权限

    <service android:name=".service.MyJobSchedulerService"
        android:permission="android.permission.BIND_JOB_SERVICE"/>
    /**
     * Job services must be protected with this permission:
     *
     * <pre class="prettyprint">
     *     &#60;service android:name="MyJobService"
     *              android:permission="android.permission.BIND_JOB_SERVICE" &#62;
     *         ...
     *     &#60;/service&#62;
     * </pre>
     *
     * <p>If a job service is declared in the manifest but not protected with this
     * permission, that service will be ignored by the OS.
     */
    public static final String PERMISSION_BIND =
            "android.permission.BIND_JOB_SERVICE";

JobScheduler参数设置指令

public void scheduleJob(View v) {
        if (!ensureJobSchedulerService()) {
            return;
        }

        JobInfo.Builder builder = new JobInfo.Builder(kJobId++, mServiceComponent);
        /**
         * Specify that this job should be delayed by the provided amount of time.
         * Because it doesn't make sense setting this property on a periodic job, doing so will
         * throw an {@link java.lang.IllegalArgumentException} when
         * {@link android.app.job.JobInfo.Builder#build()} is called.
         * @param minLatencyMillis Milliseconds before which this job will not be considered for
         *                         execution.
         */
        // 设置最小的延迟时间
        // builder.setMinimumLatency(1*1000);
        /**
         * Set deadline which is the maximum scheduling latency. The job will be run by this
         * deadline even if other requirements are not met. Because it doesn't make sense setting
         * this property on a periodic job, doing so will throw an
         * {@link java.lang.IllegalArgumentException} when
         * {@link android.app.job.JobInfo.Builder#build()} is called.
         */
        // 设置最大的延迟时间,一旦设置了这个属性,不管其他条件怎么样,jobinfo到了时间就一定会执行。
        // builder.setOverrideDeadline(5*1000);
        /** Default. 任意网络都可以*/
        // public static final int NETWORK_TYPE_NONE = 0;
        /** This job requires network connectivity. 任意网络都可以*/
        // public static final int NETWORK_TYPE_ANY = 1;
        /** This job requires network connectivity that is unmetered. 无线网络接入*/
        // public static final int NETWORK_TYPE_UNMETERED = 2;
        /** This job requires network connectivity that is not roaming. 非漫游*/
        // public static final int NETWORK_TYPE_NOT_ROAMING = 3;
        /** This job requires metered connectivity such as most cellular data networks. 移动数据网络 */
        // public static final int NETWORK_TYPE_METERED = 4;
        // 设置在什么样的网络下启动jobinfo
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);

        /**
         * Specify that to run, the job needs the device to be in idle mode. This defaults to
         * false.
         * <p>Idle mode is a loose definition provided by the system, which means that the device
         * is not in use, and has not been in use for some time. As such, it is a good time to
         * perform resource heavy jobs. Bear in mind that battery usage will still be attributed
         * to your application, and surfaced to the user in battery stats.</p>
         * @param requiresDeviceIdle Whether or not the device need be within an idle maintenance
         *                           window.
         */
        // 设置设备需要在空闲的时候,是否启动job
        builder.setRequiresDeviceIdle(false);

        /**
         * Specify that to run this job, the device needs to be plugged in. This defaults to
         * false.
         * @param requiresCharging Whether or not the device is plugged in.
         */
        // 设置是否充电情况下调度
        builder.setRequiresCharging(true);
        /**
         * Set whether or not to persist this job across device reboots.
         *
         * @param isPersisted True to indicate that the job will be written to
         *            disk and loaded at boot.
         */
        // 设置是否重启后继续调度,注意设置true是需要添加重启权限
        builder.setPersisted(false);

        /**
         * 我设置了充电下且网络连接时才触发onJobStart()的条件
         * 注意:上述的条件是与的关系,不是或
         */
        Log.d(Constant.TAG, "设置充电下且网络连接的条件");
        tv_info.setText("设置充电下且网络连接的条件");
        myJobSchedulerService.schedulejob(builder.build());
    }

结束Job任务指令

结束所有JOB

    /**
     * 杀死在这个包里注册的所有的jobinfo
     * @param v
     */
    public void cancelAllJobs(View v) {
        JobScheduler tm = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);

        /**
         * Cancel all jobs that have been registered with the JobScheduler by this package.
         *
         * 备注:这里会回调onStopJob();
         */
        tm.cancelAll();

        tv_info.setText("杀死在这个包里注册的所有的jobinfo");
    }

结束指定JOB

    public void callJobFinished() {

        if (mJobParametersMap.size() == 0) {
            return ;
        }

        JobParameters params = mJobParametersMap.valueAt(0);
        if (params == null) {
            return; 
        } else {
            /**
             * Call this to inform the JobManager you've finished executing. This can be called from any
             * thread, as it will ultimately be run on your application's main thread. When the system
             * receives this message it will release the wakelock being held.
             * <p>
             *     You can specify post-execution behaviour to the scheduler here with
             *     <code>needsReschedule </code>. This will apply a back-off timer to your job based on
             *     the default, or what was set with
             *     {@link android.app.job.JobInfo.Builder#setBackoffCriteria(long, int)}. The original
             *     requirements are always honoured even for a backed-off job. Note that a job running in
             *     idle mode will not be backed-off. Instead what will happen is the job will be re-added
             *     to the queue and re-executed within a future idle maintenance window.
             * </p>
             *
             * @param params Parameters specifying system-provided info about this job, this was given to
             *               your application in {@link #onStartJob(JobParameters)}.
             * @param needsReschedule True if this job should be rescheduled according to the back-off
             *                        criteria specified at schedule-time. False otherwise.
             */

            /**
             * 告诉JobManager 已经完成了工作,如果第二个参数为false,就是不需要重试这个jobinfo,
             *   第二个参数为true,相当于告诉系统任务失败,需要重试,而且与要遵守之前的jobinfo.
             *   
             * 备注:这里不会回调onStopJob();
            */
            jobFinished(params, false);

            String result = "callJobFinished getJobId = " + params.getJobId();
            Log.d(Constant.TAG, result);
            if (null != mainActivity) {
                mainActivity.onReceivedJobFinished(result);
            }

            mJobParametersMap.removeAt(0);
        }
    }

Job回调事件

预设置条件满足事件回调

    /**
     *  满足Job预设置条件下回调 
     */
    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        Log.d(Constant.TAG, "当前满足预设置条件,故触发 onStartJob: " + jobParameters.getJobId());

        mCurrentId ++;
        mJobParametersMap.put(mCurrentId, jobParameters);

        if (null != mainActivity) {
            mainActivity.onReceivedStartJob(jobParameters);
        }
        return true;
    }

预设置条件不满足事件回调

    /**
     * 1.被CancleAll的时候回调
     * 2.不满足预设置条件的情况下回调
     */
    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        Log.d(Constant.TAG, "不满足预设置条件, onStopJob : " + jobParameters.getJobId());

        int id = mJobParametersMap.indexOfValue(jobParameters);
        mJobParametersMap.remove(id);

        if (null != mainActivity) {
            mainActivity.onReceivedStopJob(jobParameters);
        }
        return false;
    }

结语

个人任务Job本质提供合适的省电场景,让应用执行一些费时且优先级不是很高的事情,比如备份,数据上传等等,当然不建议利用这个特性进行保活,即利用该机制完成应用的频繁启动,这样就违背Google的初衷了

Demo下载

http://download.csdn.net/download/su749520/10130262

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

法迪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值