Android省电的秘密之JobScheduler

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内部时序图

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

(0)

相关推荐

  • Android5.0中JobScheduler的使用方法

    在Android 5.0中使用JobScheduler •原文链接 : using-the-jobscheduler-api-on-android-lollipop •译者 : Mr.Simple •校对者 : Mr.Simple 在这篇文章中,你会学习到在Android 5.0中如何使用JobScheduler API.JobScheduler API允许开发者在符合某些条件时创建执行在后台的任务. 介绍 在android开发中,会存在这么些场景 : 你需要在稍后的某个时间点或者当满足某个特定

  • Android省电的秘密之JobScheduler

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

  • 安卓(android)仿电商app商品详情页按钮浮动效果

    1.效果图如下: 这效果用户体验还是很酷炫,今天我们就来讲解如何实现这个效果. 2.分析 为了方便理解,作图分析 如图所示,整个页面分为四个部分: 1.悬浮内容,floatView 2.顶部内容,headView 3.中间内容,与悬浮内容相同,middleView 4.商品详情展示页面,detailView 因为页面内容高度会超出屏幕,所以用Scrollview实现滚动,悬浮view与scrollview同级,都在一个帧布局或者相对布局中. 当y方向的滚动距离小于中间的内容middleView到

  • Android 5.0最应该实现的8个期望

    Android 5.0 是 Google 于 2014 年 10 月 15 日(美国太平洋时间)发布的全新 Android 操作系统.北京时间 2014 年 6 月 26 日 0 时,Google I/O 2014 开发者大会在旧金山正式召开,发布了 Android 5.0 的开发者预览.2015年的三款新 Nexus 设备--Nexus 6.Nexus 9平板及 Nexus Player 将率先搭载 Android 5.0,之前的Nexus4. Nexus 5.Nexus 7及 Nexus 1

  • android仿京东商品属性筛选功能

    筛选和属性选择是目前非常常用的功能模块:几乎所有的APP中都会使用: 点击筛选按钮会弹出一个自己封装好的popupWindow,实用方法非常简单:两行代码直接显示:(当然初始化数据除外) 这里和以前用到的流式布局有些不一样:流式布局 以前使用的是单个分类,而且也没有在项目中大量实用:这个筛选功能除了数据外几乎都是从项目中Copy出来的: 整个popupWindow布局就是一个自定义的ListView,这个自定义的listview主要是控制listview的高度: 如果数据少的话就是自适应,如果数

  • android商品详情页面设计详解

    本文实例为大家分享了android商品详情展示的具体代码,供大家参考,具体内容如下 首先看下效果图(样式,布局可以根据产品要求改变), 先大致说一下,整体结构使用的是LinearLayout实现,分上下两部分,上边就是我们能滑动的自定义布局,下面就是"进入店铺","立即购买"这两个无关紧要的布局: 下面是根据产品的要求更改的,每个APP几乎都不一样,所以说是无关紧要: 布局文件骨架: <LinearLayout xmlns:android="http

  • 详解Android 8.0以上系统应用如何保活

    最近在做一个埋点的sdk,由于埋点是分批上传的,不是每次都上传,所以会有个进程保活的机制,这也是自研推送的实现技术之一:如何保证Android进程的存活. 对于Android来说,保活主要有以下一些方法: 开启前台Service(效果好,推荐) Service中循环播放一段无声音频(效果较好,但耗电量高,谨慎使用) 双进程守护(Android 5.0前有效) JobScheduler(Android 5.0后引入,8.0后失效) 1 像素activity保活方案(不推荐) 广播锁屏.自定义锁屏(

  • Android个人手机通讯录开发详解

    一.Android 个人手机通讯录开发 数据存储:SQLite 数据库 开发工具:Android Studio 二.Phone Module 简介 1. 界面展示 2. 文件结构简单分析 三.个人手机通讯录代码实现 1. 清单文件 (AndroidManifest.xml) <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.andr

  • Android实现通讯录功能

    本文实例为大家分享了Android通讯录案例,供大家参考,具体内容如下 实战演练--通讯录 1.功能描述:通过SQLite实现数据库的增删改查 2.技术要点:SQLite的基本操作 3.实现步骤: ① 创建一个类继承SQLiteOpenHelper ② 重写父类构造方法.onCreate().onUpgrade() ③ 增删改查 4.效果图 5.案例代码 MyHelper.java package com.example.sqlite; import android.content.Contex

  • Android Studio实现简单的通讯录

    网上找的一个单页面通讯录,修改之后将添加联系人和修改/删除联系人分为两个独立页面 MainActivity package com.example.test; import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.database.Cursor;

随机推荐