Android省电的秘密之JobScheduler

Android省电的秘密之JobScheduler,第1张

概述JobScheduler是AndroidL版本新引入的API,JobScheduler,顾名思义,是用来调度工作。工作被调度的条件包括网络变化,充电插拔,周期执行等。使用场景包括wifi条件下数据下载上传等等。谷歌为什么要引入这个新的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) getSy@R_301_6563@Service(Context.JOB_SCHEDulER_SERVICE);  builder=new Builder(1,new Componentname(this,DemoService.class));  builder.setrequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED);  Js.schedule(builder.build()); }}
@H_502_11@

需要被调度的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>() {  @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; }}
@H_502_11@

清单

<service androID:name=".DemoService "androID:permission="androID.permission.BIND_JOB_SERVICE" androID:exported="true"/>
@H_502_11@

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条件重新满足情况下重新调度。经典的写法如下。

开始调度

@OverrIDepublic boolean onStartJob(final JobParameters params) { mDownloadArtworkTask = new DownloadArtworkTask(this) { @OverrIDe protected voID onPostExecute(Boolean success) {  jobFinished(params,!success); } }; mDownloadArtworkTask.execute(); return true;}
@H_502_11@

停止调度

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

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

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

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

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

JobScheduler内部时序图

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

总结

以上是内存溢出为你收集整理的Android省电的秘密之JobScheduler全部内容,希望文章能够帮你解决Android省电的秘密之JobScheduler所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/web/1146990.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-31
下一篇2022-05-31

发表评论

登录后才能评论

评论列表(0条)

    保存