认识 android-job
简评: Android 实现后台任务的最佳实践。
对于现在的应用来说,在应用生命周期之外运行一些后台任务可以说已经是一项必不可少的需求了。这些任务可能是在某个时间点提醒用户什么事情或同步本地数据到服务器等等。
对此 Android 有一系列方式来实现这些后台任务:
1. JobSchedular
JobSchedular 在 Lollipop (API level 21) 中被引入,也是目前实现后台任务最有效的手段。其根据条件来执行任务,具体条件可能是「设备连接上了网络」、「正在充电」...
官方文档对此已经讲得很详细了。
2. GCM Network Manager(目前已更新为 FCM)
GCM Network Manager 提供的 API 和 JobSchedular 很相似,支持 API 9 及以上。唯一的问题就在于是属于 Google Play Service SDK 的一部分,所以这里就不多说了。
3. AlarmManager
JobSchedular 和 GCM Network Manager 可以基于条件定义任务,比如网络连接状态改变、充电状态改变,这些都不属于会在某个固定时间点触发的后台任务。但有时你的应用可能需要在某个固定时间点触发一个通知、周期性的任务什么的。或者针对 API level 21 以下,又没有集成 Google Play Service SDK 的应用实现一些后台任务功能。这时就可以考虑使用 AlarmManager。
遇见 Android-Job
可以看到三个方案都有各自的优缺点,为了解决这个问题,Evernote 开源了 Android-Job 这个非常出色的项目。
Android-Job 能根据当前系统的版本,是否集成 Google Play Service SDK 和要执行的任务类型调用不同的 API,兼容当前主流版本。
集成:
apply plugin: 'com.android.application'
android {
...
}
dependencies {
...
compile 'com.evernote:android-job:1.1.8'
}
使用:
Android-Job 主要包含了下面四个类/接口:
- Job:所有我们的 Job 都需要继承它,并实现 onRunJob 方法。
- JobRequest:用来定义一个具体的任务(Job)。
- JobCreator:根据任务的 tag 来创建任务。
- JobManager:android-job 的入口。
示例:
我们来创建一个「展示通知任务」。首先,实现 Job:
class ShowNotificationJob extends Job {
static final String TAG = "show_notification_job_tag";
@NonNull
@Override
protected Result onRunJob(Params params) {
PendingIntent pi = PendingIntent.getActivity(getContext(), 0,
new Intent(getContext(), MainActivity.class), 0);
Notification notification = new NotificationCompat.Builder(getContext())
.setContentTitle("Android Job Demo")
.setContentText("Notification from Android Job Demo App.")
.setAutoCancel(true)
.setContentIntent(pi)
.setSmallIcon(R.mipmap.ic_launcher)
.setShowWhen(true)
.setColor(Color.RED)
.setLocalOnly(true)
.build();
NotificationManagerCompat.from(getContext())
.notify(new Random().nextInt(), notification);
return Result.SUCCESS;
}
static void schedulePeriodic() {
new JobRequest.Builder(ShowNotificationJob.TAG)
.setPeriodic(TimeUnit.MINUTES.toMillis(15), TimeUnit.MINUTES.toMillis(5))
.setUpdateCurrent(true)
.setPersisted(true)
.build()
.schedule();
}
}
可以看到其中我们通过 JobRequest 来安排一个任务,任务的 tag 作为一个任务的唯一标识。
其中 JobRequest 包含了很多的方法,都在项目的 Github 页面中有详细的说明。
之后,实现 JobCreator 接口:
class DemoJobCreator implements JobCreator {
@Override
public Job create(String tag) {
switch (tag) {
case ShowNotificationJob.TAG:
return new ShowNotificationJob();
default:
return null;
}
}
}
可以看到这里是需要根据 Job 的 tag 来创建任务的。然后,在我们应用的自定义 Application 类里注册 JobCreator :
public class MainApp extends Application {
@Override
public void onCreate() {
super.onCreate();
JobManager.create(this).addJobCreator(new DemoJobCreator());
}
}
最后,在需要的地方注册任务:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ShowNotificationJob.schedulePeriodic();
}
}
是不是很简单。不再需要自己去考虑什么情况该用哪种方案了,只需要这样统一的实现就可以啦。
顺便分享一个 debug 的小 tip。当我们在 debug 的时候,往往会把间隔时间调短从而可以马上看到效果。但是在 Android N 中,规定了定时任务间隔最少为 15 分钟,如果小于 15 分钟会得到一个错误:intervalMs is out of range
这时,可以调用 JobManager 的 setAllowSmallerIntervalsForMarshmallow(true)
方法在 debug 模式下避免这个问题。但在正式环境下一定要注意间隔时间设置为** 15 分钟以上**。
public class MainApp extends Application {
@Override
public void onCreate() {
super.onCreate();
JobManager.create(this).addJobCreator(new DemoJobCreator());
JobManager.instance().getConfig().setAllowSmallerIntervalsForMarshmallow(true); // Don't use this in production
}
}
原文链接:Easy Job Scheduling with Android-Job
推荐阅读:Android - Spring Animation,让应用的 View 像弹簧一样动起来
认识 android-job的更多相关文章
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Android Studio 多个编译环境配置 多渠道打包 APK输出配置
看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...
- JS调用Android、Ios原生控件
在上一篇博客中已经和大家聊了,关于JS与Android.Ios原生控件之间相互通信的详细代码实现,今天我们一起聊一下JS调用Android.Ios通信的相同点和不同点,以便帮助我们在进行混合式开发时, ...
- Android UI体验之全屏沉浸式透明状态栏效果
前言: Android 4.4之后谷歌提供了沉浸式全屏体验, 在沉浸式全屏模式下, 状态栏. 虚拟按键动态隐藏, 应用可以使用完整的屏幕空间, 按照 Google 的说法, 给用户一种 身临其境 的体 ...
随机推荐
- foundation DB问题
1. go get github.com/apple/foundationdb/bindings/go/src/fdb # github.com/apple/foundationdb/bindings ...
- 使用 Supervsior 守护进程
概述 一般来说,在终端开启的服务,如果退出终端的话,就会自动关闭服务.这个时候需要守护这个服务的进程. Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用在 UNIX-li ...
- 阶段3 3.SpringMVC·_01.SpringMVC概述及入门案例_04.入门程序之搭建开发环境
选择骨架构建 默认选中next-然后finish后就会去网上下载插件.会比较耗费时间. 添加一组键值对: archetypeCatalog internal 添加了这组坚持对,就可以解决Mavn项目创 ...
- Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use.
Several ports (8005, 8080, 8009) required by Tomcat v8.5 Server at localhost are already in use. The ...
- etcd节点扩容至两个节点
本篇已经安装了单个etcd,然后进行扩容etcd节点至2个,安装单节点请参照:https://www.cnblogs.com/effortsing/p/10295261.html 实验架构 test1 ...
- ElasticSearch的中文分词器ik
一.前言 为什么要在elasticsearch中要使用ik这样的中文分词呢,那是因为es提供的分词是英文分词,对于中文的分词就做的非常不好了,因此我们需要一个中文分词器来用于搜索和使用. 二.IK ...
- LeetCode.1051-身高检查器(Height Checker)
这是小川的第390次更新,第420篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第252题(顺位题号是1051).要求学生按身高递增的顺序站列来拍年度照片. 返回没有站在 ...
- 【Deep Learning Nanodegree Foundation笔记】第 1 课:INTRODUCTION Welcome
Welcome to the Deep Learning Nanodegree Foundations Program! In this lesson, you'll meet your instru ...
- 逻辑回归2-scikit-learn参数介绍
1.1 scikit-learn参数介绍 1.1.1 导入 from sklearn.linear_model import LogisticRegression 1.1.2 版本 sci ...
- ubuntu16.04+Titan Xp安装显卡驱动+Cuda9.0+cudnn
硬件环境 ubuntu 16.04LTS + windows10 双系统 NVIDIA TiTan XP 显卡(12G) 软件环境 搜狗输入法 显卡驱动:LINUX X64 (AMD64/EM64T) ...