认识 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 的说法, 给用户一种 身临其境 的体 ...
随机推荐
- ShuffleNet V2: Practical Guidelines for Efficient CNN Architecture Design
1. 摘要 最近,神经网络的架构设计都是基于计算复杂度的间接度量,比如 FLOPs.然而,直接的度量比如运行速度,其实也会依赖于内存访问和平台特性等其它因素. 因此本文建议直接在目标平台上用直接度量进 ...
- python - 函数any() 和 all() 的区别
转自:https://www.cnblogs.com/nulige/p/6128816.html any()与all()函数的区别: any是任意,而all是全部. 版本:该函数适用于2.5以上版本, ...
- Python Module_sys/random
目录 目录 前言 软件环境 Python标准库初识 Python常用的标准库模块 dir 函数使用方法 sys操作系统功能模块 sysstdinsysstdoutsysstderr标准IOError流 ...
- Centos7 修改系统时间和硬件时间不一致的问题
查看系统时间 [root@localhost ~]# dateSat Feb 24 14:41:22 CST 2018 查看硬件时间 [root@localhost ~]# hwclock --sho ...
- python学习之函数(二)
4.4.6 动态传参 动态传参是针对形参而言 1.动态位置参数 在静态位置参数时,我们知道,定义函数时有几个位置参数,调用时就必须给几个实参,不能多也不能少.有时候,实际应用过程中,参数往往不能固 ...
- SpringBoot常用注解有哪些?
@Service: 注解在类上,表示这是一个业务层bean@Controller: 注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一个数据访问层bean@Comp ...
- 双系统正确卸载Ubuntu系统
双系统正确卸载Ubuntu系统 安装系统后由于显卡驱动问题,无法开机,从而只能卸载重装,重装过程如下. 第一步:下载需要的工具包,这里我用的是MBRfix, 可以直接从我分享的网盘链接下载,密码gw ...
- Spark中的术语图解总结
参考:http://www.raincent.com/content-85-11052-1.html 1.Application:Spark应用程序 指的是用户编写的Spark应用程序,包含了Driv ...
- opencv滤镜-使用opencv实现各种图像滤镜特效
图像处理-滤镜 链接:https://mangoroom.cn/opencv/image-processing-filter.html opencv滤镜-实现晕影vignetting效果 链接:htt ...
- java tomcat服务器
1.什么是javaweb? Java web,是用java技术来解决相关web互联网领域的技术的总称. web包括:web服务器和web客户端两部分.java在最早web客户端的应用有java app ...