Android省电的秘密之JobScheduler

 更新时间:2017年02月07日 15:51:25   作者:九九叔  
JobScheduler是Android L版本新引入的API,JobScheduler,顾名思义,是用来调度工作。工作被调度的条件包括网络变化,充电插拔,周期执行等。谷歌为什么要引入这个新的API呢?是为了省电而制定的一种规范。下面跟着小编一起来看下吧

JobScheduler是Android L版本新引入的API,JobScheduler,顾名思义,是用来调度工作。工作被调度的条件包括网络变化,充电插拔,周期执行等。使用场景包括wifi条件下数据下载上传等等。谷歌为什么要引入这个新的API呢?是为了省电而制定的一种规范。想想如果每个开发者都利用这个API进行wifi网络下数据上传,数据上传的操作将会被统一到同一个时间点,批量处理,这样比许多应用单独唤醒要省电的多。

下面展示一个小例子

主MainActivity

builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); 代表免费的网络,通常就是指wifi了

public class MainActivity extends Activity {
 JobScheduler js;
 JobInfo.Builder builder;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  js=(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
  builder=new Builder(1, new ComponentName(this, DemoService.class));
  builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);
  js.schedule(builder.build());
 }
}

需要被调度的Job

当wifi可用时,这个DemoService 就会执行onStartJob

public class DemoService extends JobService{
 @Override
 public boolean onStartJob(JobParameters params) {
  // TODO Auto-generated method stub
  final JobParameters mJobParameters=params;
  AsyncTask<Void, Void, Void> mTask = new AsyncTask<Void, Void, Void>() {
  @Override
  protected Void doInBackground(Void... params) {
   // TODO Auto-generated method stub
   return null;
  }
  @Override
  protected void onPostExecute(Void result) {
   // TODO Auto-generated method stub
   Toast.makeText(wenfengService.this, "hello", 1000).show();
   jobFinished(mJobParameters, true);
   super.onPostExecute(result);
  }
  };
  mTask.execute();
  return true;
 }
 @Override
 public boolean onStopJob(JobParameters params) {
  // TODO Auto-generated method stub
  Toast.makeText(this, "bye", 1000).show();
  return true;
 }
}

清单

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

onStartJob.png

onStartJob函数常常有两种场景

1.不耗时的操作,这时你应该返回false

2.耗时的操作例如数据下载等,这是你应该开启一个新线程(因为JobService是跑在主线程的),并且返回true

如果调度是任务执行失败了,怎么办?

任务失败的情况有很多,例如下载失败了,例如下载过程wifi断掉了。

没问题,google提供了方便的重新调度的方法。

例如如果下载过程中,wifi断掉了,JobService会回调onStopJob函数,这是只需要把函数的返回值设置为true就可以了。当wifi重新连接后,JobService会重新回调onStartJob函数。

而如果下载失败了,例如上面的例子中的AsyncTask执行失败,怎么办呢?我们只需要在AsyncTask的onPostExecute中执行jobFinished(mJobParameters, true),这里的true代表任务要在wifi条件重新满足情况下重新调度。经典的写法如下。

开始调度

@Override
public boolean onStartJob(final JobParameters params) {
 mDownloadArtworkTask = new DownloadArtworkTask(this) {
 @Override
 protected void onPostExecute(Boolean success) {
  jobFinished(params, !success);
 }
 };
 mDownloadArtworkTask.execute();
 return true;
}

停止调度

@Override
public boolean onStopJob(final JobParameters params) {
 if (mDownloadArtworkTask != null) {
 mDownloadArtworkTask.cancel(true);
 }
 return true;
}

如果调度的任务老是执行失败,怎么办?

为了省电的考虑,失败的任务在执行条件满足的情况下,要延时一段时间才能执行。而且随着失败次数的增多,延时会越长。举个例子,因为wifi断开而执行失败的任务,在wifi连上后不会马上执行,延时一段时间才能执行。

延时时间=30s*失败次数。

下图是JobScheduler在framework层的时序图,下一章将用adb指令直观查看JobScheduler的情况,不容错过。有问题可以留言哟,大家一起探讨!

JobScheduler内部时序图

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • Android组件创建DrawerLayout导航

    Android组件创建DrawerLayout导航

    这篇文章主要为大家详细介绍了Android组件创建DrawerLayout导航的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android framework ATMS启动流程

    Android framework ATMS启动流程

    这篇文章主要为大家介绍了Android framework ATMS启动流程示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Android Glide图片加载(加载监听、加载动画)

    Android Glide图片加载(加载监听、加载动画)

    这篇文章主要为大家详细介绍了Android Glide图片加载的具体实现方法,包括加载监听、加载动画,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11
  • 全面解析Android中对EditText输入实现监听的方法

    全面解析Android中对EditText输入实现监听的方法

    这篇文章主要介绍了Android中对EditText输入实现监听的方法,包括一个仿iOS的带清除功能的ClearEditText输入框控件的详细使用介绍,需要的朋友可以参考下
    2016-04-04
  • Android网络连接判断与相关处理

    Android网络连接判断与相关处理

    这篇文章主要为大家详细介绍了Android网络连接判断操作,帮助大家判断WIFI网络是否可用,判断MOBILE网络是否可用,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android Doze模式下Alarm定时任务实现流程详解

    Android Doze模式下Alarm定时任务实现流程详解

    这篇文章主要介绍了Android Doze模式下Alarm定时任务实现,Android的定时任务有两种,一种是JavaAPI提供的Timer类,另一种就是使用Android的Alarm机制
    2022-11-11
  • Android编程开发之打开文件的Intent及使用方法

    Android编程开发之打开文件的Intent及使用方法

    这篇文章主要介绍了Android编程开发之打开文件的Intent及使用方法,已实例形式分析了Android打开文件Intent的相关布局及功能实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • Android使用GridView实现表格分割线效果

    Android使用GridView实现表格分割线效果

    这篇文章主要为大家详细介绍了Android使用GridView实现表格分割线效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • Android webview使用方法总结

    Android webview使用方法总结

    这篇文章主要介绍了Android webview使用方法总结的相关资料,需要的朋友可以参考下
    2017-07-07
  • Android客户端实现注册、登录详解(2)

    Android客户端实现注册、登录详解(2)

    这篇文章主要为大家详细介绍了Android客户端实现注册、登录代码第二篇,App与服务器的交互实现登录和自动登录功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论