在进行Android开发时,会遇到这样的情况:想在将来的某个时间或在一定条件下运行任务,如上传图片、下载歌曲等操作想在接入电源或连接到WIFI时执行。android L提供了JobScheduler API。

当一组预定义的条件得到满足时,JobScheduler API的应用程序执行一项操作。不像AlarmManager类,JobScheduler的时间测定是不准确的。此外,该API能够一同批处理各种工作。

JobService:

[java] view plaincopy
  1. public class MyJobService extends JobService {
  2. private static final String TAG = "MyJobService";
  3. /**
  4. * false: 该系统假设任何任务运行不需要很长时间并且到方法返回时已经完成。
  5. * true: 该系统假设任务是需要一些时间并且当任务完成时需要调用jobFinished()告知系统。
  6. */
  7. @Override
  8. public boolean onStartJob(JobParameters params) {
  9. Log.i(TAG, "Totally and completely working on job " + params.getJobId());
  10. if (isNetworkConnected()) {
  11. new SimpleDownloadTask().execute(params);
  12. return true;
  13. } else {
  14. Log.i(TAG, "No connection on job " + params.getJobId() + "; sad face");
  15. }
  16. return false;
  17. }
  18. /**
  19. * 当收到取消请求时,该方法是系统用来取消挂起的任务的。
  20. * 如果onStartJob()返回false,则系统会假设没有当前运行的任务,故不会调用该方法。
  21. */
  22. @Override
  23. public boolean onStopJob(JobParameters params) {
  24. Log.i(TAG, "stop job " + params.getJobId());
  25. return false;
  26. }
  27. private boolean isNetworkConnected() {
  28. ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  29. NetworkInfo info = manager.getActiveNetworkInfo();
  30. return (info != null && info.isConnected());
  31. }
  32. private class SimpleDownloadTask extends
  33. AsyncTask<JobParameters, Void, String> {
  34. private JobParameters mJobParam;
  35. @Override
  36. protected String doInBackground(JobParameters... params) {
  37. mJobParam = params[0];
  38. try {
  39. InputStream is = null;
  40. int len = 50;
  41. URL url = new URL("http://www.baidu.com");
  42. HttpURLConnection conn = (HttpURLConnection) url
  43. .openConnection();
  44. conn.setReadTimeout(10000);
  45. conn.setConnectTimeout(15000);
  46. conn.setRequestMethod("GET");
  47. conn.connect();
  48. int responseCode = conn.getResponseCode();
  49. Log.i(TAG, "response code is : " + responseCode);
  50. is = conn.getInputStream();
  51. Reader reader = null;
  52. reader = new InputStreamReader(is, "UTF-8");
  53. char[] buffer = new char[len];
  54. reader.read(buffer);
  55. return new String(buffer);
  56. } catch (Exception e) {
  57. return "unable to retrieve web page";
  58. }
  59. }
  60. @Override
  61. protected void onPostExecute(String result) {
  62. jobFinished(mJobParam, false);
  63. Log.i(TAG, "获取结果:" + result);
  64. }
  65. }
  66. }

调用:

[java] view plaincopy
  1. public class MainActivity extends Activity {
  2. private TextView result;
  3. private ComponentName jobService;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. jobService = new ComponentName(this, MyJobService.class);
  9. Intent service = new Intent(this, MyJobService.class);
  10. startService(service);
  11. result = (TextView) findViewById(R.id.result_tv);
  12. Button btn = (Button) findViewById(R.id.button);
  13. btn.setOnClickListener(new OnClickListener() {
  14. @Override
  15. public void onClick(View v) {
  16. pollServer();
  17. }
  18. });
  19. }
  20. private void pollServer() {
  21. JobScheduler scheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
  22. int jobId;
  23. for (int i = 0; i < 10; i++) {
  24. jobId = i;
  25. JobInfo jobInfo = new JobInfo.Builder(jobId, jobService)
  26. .setMinimumLatency(5000)// 设置任务运行最少延迟时间
  27. .setOverrideDeadline(60000)// 设置deadline,若到期还没有达到规定的条件则会开始执行
  28. .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)// 设置网络条件
  29. .setRequiresCharging(true)// 设置是否充电的条件
  30. .setRequiresDeviceIdle(false)// 设置手机是否空闲的条件
  31. .build();
  32. result.append("scheduling job " + i + "!\n");
  33. scheduler.schedule(jobInfo);
  34. }
  35. }
  36. }

注册:

[html] view plaincopy
  1. <service
  2. android:name="com.example.jobschedulerdemo.MyJobService"
  3. android:permission="android.permission.BIND_JOB_SERVICE" >
  4. </service>

如果应用程序需要停止特定或所有工作,可以通过对JobScheduler对象调用cancel(int jobId)或cancelAll()实现。

JobScheduler的使用相关推荐

  1. JobScheduler学习 附官方demo

    后台任务是应用开发中常见的问题. 最简单的做法就是直接开一个Thread,用Handler通信即可,但是所开的线程和活动是没有关系的,一旦应用被杀死,就和之前所创建的线程失去了联系,就算活动再次启动, ...

  2. 【Android 进程保活】应用进程拉活 ( 双进程守护 + JobScheduler 保活 | 成功率最高 | 推荐使用 )

    文章目录 一. 双进程守护保活 + JobScheduler 原理 二. 双进程守护保活 + JobScheduler 源码 1.JobService 代码 2.判定服务运行工具类 3.清单文件 4. ...

  3. 【Android 进程保活】应用进程拉活 ( JobScheduler 拉活 | JobScheduler 使用流程 | JobService 服务 | 不同版本兼容 | 源码资源 )

    文章目录 一. JobScheduler 用法简介 二. JobScheduler 拉活完整代码 1. JobService 2.清单文件 3.启动 JobScheduler 任务 4.运行效果 三. ...

  4. 【Android 电量优化】JobScheduler 源码分析 ( JobServiceContext 源码分析 | 闭环操作总结 | 用户提交任务 | 广播接收者接受相关广播触发任务执行 )★

    文章目录 一.JobServiceContext 引入 二.JobServiceContext 源码分析 三.用户在应用层如何使用 JobScheduler 四.用户提交任务 五.广播接收者监听广播触 ...

  5. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | 任务检查 | 任务执行 )

    文章目录 一.回调 StateChangedListener 接口 二.JobHandler 处理 ( 任务检查 ) 三.maybeRunPendingJobsH 方法 四.assignJobsToC ...

  6. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  7. 【Android 电量优化】JobScheduler 相关源码分析 ( JobSchedulerService 源码分析 | Android 源码在线网址推荐 )

    文章目录 一.JobScheduler 提交任务 schedule 方法源码分析 二.schedule(JobInfo job, int uId) 方法 三.scheduleAsPackage 方法 ...

  8. 【Android 电量优化】电量优化 ( JobScheduler | JobService | AsyncTask )

    文章目录 一.JobScheduler 使用流程 二.AsyncTask 简介 三.JobScheduler 开发流程 四.JobScheduler 代码示例 1.JobScheduleManager ...

  9. android系统(63)---Jobscheduler运行机制详解

    android之Jobscheduler运行机制详解 如果想在将来达到一定条件下执行某项任务时,可以在一个实现了JobService的子类的onStartJob方法中执行这项任务,使用JobInfo的 ...

最新文章

  1. 基于FPGA的SPI FLASH控制器设计
  2. jenkins如何实现重新发布历史构建记录里的版本
  3. 明年去哪里?简历先整理一波!
  4. c语言设置程序自动执行,c语言如何设置程序进程执行优先权
  5. python之模块csv之CSV文件一次写入多行
  6. HDU1164 Eddy's research I【素因子分解】
  7. C/C++结构体struct 与结构体数组和枚举型enum的结合使用
  8. 微信公众平台开发(103) 四六级成绩查询
  9. 什么样的数据才有价值?应该怎样收集和处理?终于有人讲明白了
  10. CAN笔记(8) 优先级
  11. html5与其他语言的优势,浅谈:html5和html的区别
  12. 【Flink】Flink 使用 CopyOnWriteArrayList 进行数据缓存的时候 一个bug
  13. vue main.js中引入js_手把手教你深入Vue3.0(Vue-cli4)项目打包性能优化实践
  14. 关于php反射机制的一些理解
  15. nodejs 从gitlab拉下来后运行爆错解决
  16. 亲,你们都在家办公吗?啥感受?hahaha
  17. java框架快速使用mysql_阿里java架构师教你怎么用mysql怒怼面试官
  18. python 微信爬虫_PythonWchatScrapy
  19. gx works2 版本号_GX Works2 64位
  20. Main Menu菜单栏消失解决

热门文章

  1. mysql脚本下载_Mysql备份脚本
  2. nas服务器搭建 linux,小白都能看懂的NAS服务器搭建教程
  3. android dialog横屏,解决dialog在横竖屏切换时消失
  4. 什么叫取反_转载:CodeReview正确的姿势是什么?
  5. 济南计算机中考分数,【更新版】2017济南各初中中考成绩汇总!
  6. android系统动态切换输入法,一种动态切换Android系统输入法的弹出模式的方法与流程...
  7. B站王道论坛计算机网络,成都理工大学计算机网络考研学长经验分享
  8. Postman 最被低估的功能!
  9. Linus怒批GitHub:制造了毫无用处的垃圾合并信息!
  10. 皮一皮:自作多情的表率...