Android里的任务调度JobScheduler
2016-12-12 18:17
267 查看
JobScheduler是Android 5.0后新增的API,它允许您通过为系统定义要在以后的某个时间或在指定的条件下(例如,当设备在充电时)异步运行的作业来优化电池寿命。
JobSchedulre特性
1、支持在一个任务上组合多个条件;
2、内置条件:设备待机、设备充电和连接网络;
3、支持持续的job,这意味着设备重启后,之前被中断的job可以继续执行;
4、支持设置job的最后执行期限;
5、根据你的配置,可以设置job在后台运行还是在主线程中运行;
创建JobScheduler
集成JobService,有onStartJob和onStopJob两个方法是一定要实现的。任务开始的时候调用onStartJob(JobParameters jobP),该方法返回的是boolean值,如果返回false,该系统假定任何任务运行不需要很长时间并且到方法返回时已经完成;如果返回true,那么系统假设任务是需要一些时间并且负担落到你(开发者)的身上,当给定的任务完成时通过调用jobFinished(JobParameters params, boolean needsRescheduled)告知系统。
当收到取消请求时,onStopJob(...)是系统用来取消挂起的任务的。重要的是要注意到,如果onStartJob返回
在AndroidMainfest.xml中注册
我们可以通过JobInfo.Builder来创建任务
上面有几个属性在设置的时候需要特别注意:
取消任务:
JobSchedulre特性
1、支持在一个任务上组合多个条件;
2、内置条件:设备待机、设备充电和连接网络;
3、支持持续的job,这意味着设备重启后,之前被中断的job可以继续执行;
4、支持设置job的最后执行期限;
5、根据你的配置,可以设置job在后台运行还是在主线程中运行;
创建JobScheduler
public class TaskJobService extends JobService { @Override public boolean onStartJob(JobParameters jobParameters) { mHandler.sendMessage(Message.obtain(mHandler, 1, jobParameters) ); return true; } @Override public boolean onStopJob(JobParameters jobParameters) { mHandler.removeMessages(1); return false; } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { Toast.makeText( getApplicationContext(), "JobService task running", Toast.LENGTH_SHORT ) .show(); jobFinished( (JobParameters) msg.obj, false ); } }; }
集成JobService,有onStartJob和onStopJob两个方法是一定要实现的。任务开始的时候调用onStartJob(JobParameters jobP),该方法返回的是boolean值,如果返回false,该系统假定任何任务运行不需要很长时间并且到方法返回时已经完成;如果返回true,那么系统假设任务是需要一些时间并且负担落到你(开发者)的身上,当给定的任务完成时通过调用jobFinished(JobParameters params, boolean needsRescheduled)告知系统。
当收到取消请求时,onStopJob(...)是系统用来取消挂起的任务的。重要的是要注意到,如果onStartJob返回
false,当取消请求被接收时,该系统假定没有目前运行的工作。换句话说,它根本就不调用onStopJob。有一点要注意的是,工作服务在你的应用程序的主线程上运行。这意味着,你必须使用另一个线程处理程序,或运行时间更长的任务异步任务以不阻塞主线程。
在AndroidMainfest.xml中注册
<service android:name=".jobs.TaskJobService" android:permission="android.permission.BIND_JOB_SERVICE"></service>
我们可以通过JobInfo.Builder来创建任务
private JobScheduler mJobScheduler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); findViewById(R.id.btn_start_task).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startTask(); } }); } /** * 创建任务 */ private void startTask(){ ComponentName cn = new ComponentName(this, TaskJobService.class); JobInfo.Builder jobBuilder = new JobInfo.Builder(1, cn); jobBuilder.setPeriodic(3000);//任务每三秒定期运行一次 //setMinimumLatency(long minLatencyMillis):在规定的时间内到了不执行任务,和setPeriodic不兼容 //setOverrideDeadline(long maxExecutionDelayMillis) 还没有到规定时间内任务已经开始执行,和setPeriodic不兼容 //setPersisted(boolean isPersisted):设置重启之后任务是否继续执行。 //setRequiredNetworkType(int networkType):设备处于一种特定的网络中时,它才启动。 // 它的默认值是JobInfo.NETWORK_TYPE_NONE,这就意味着,无论是否有网络连接,该任务均可以运 //行。另外两个可用的类型是JobInfo.NETWORK_TYPE_ANY,这需要某种类型的网络连接可用,工作才可以运行; // 以及JobInfo.NETWORK_TYPE_UNMETERED,这就要求设备在非蜂窝网络中 //setRequiresCharging(boolean requiresCharging):设备开始充电时任务开始执行。 //setRequiresDeviceIdle(boolean requiresDeviceIdle):如果用户没有使用设置,该任务不执行。 mJobScheduler.schedule(jobBuilder.build()); }
上面有几个属性在设置的时候需要特别注意:
setRequiredNetworkType(int networkType)、
setRequiresCharging(boolean requireCharging)和
setRequiresDeviceIdle(boolean requireIdle)可能会导致你的工作永远不启动,除非
setOverrideDeadline(long time)还设置允许即使不符合条件的情况下,你的工作也可以运行。一旦规定优先条件,你可以创建JobInfo对象,并发送它到你的
JobScheduler对象。
取消任务:
@Override protected void onDestroy() { super.onDestroy(); //取消单个 //mJobScheduler.cancel(TASK_NUM); //取消全部 mJobScheduler.cancelAll(); }
相关文章推荐
- Andorid 日历控件库,可左右滑动,显示公历,农历,节假日等功能
- Andorid Launcher程序代码分析
- android root实践
- Record log while in programing
- Messenger实现Android IPC
- 用ActionBar+Fragment实现Tab分类列表
- android gralloc 流程分析
- Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析
- ListView子控件抢占焦点的问题
- 一个监听器绑定多个按钮控件
- 通过ADB命令删除本地文件后,Andorid系统图库不更新的问题
- Android API Level
- Android开发中常见的设计模式
- AlertDialog类的使用
- 在onTabSelected里面调用viewPager.setCurrentItem方法发生java.lang.NullPointerException错误
- Unity java C 互调
- Github官方app分析——用户身份验证模块
- android下文件访问权限及修改
- React-native for Android硅步之旅
- Andorid Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/Buffer