认识 android-job

Android进阶——更节电的后台任务JobScheduler 机制使用详解 JobScheduler 机制中把每个需要后台的业务抽象为一个Job,通过系统管理Job,来提高资源的利用率和减少不必要的唤醒,从而提高性能,节省电源。当系统启动时会通过system_server进程启动****服务,然后当使用该机制时,首先通过JobInfo构造具体的后台任务对象,并通过传入到后台任务调度器,当满足配置的条件时系统便会在对应的JobService上执行对应的作业。简而言之,系统提供了一种条件周期性执行的后台任务,无需开发者自己去唤醒,达到配置的条件便会自动执行。 阅读详情

简评: 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 主要包含了下面四个类/接口:

  1. Job:所有我们的 Job 都需要继承它,并实现 onRunJob 方法。
  2. JobRequest:用来定义一个具体的任务(Job)。
  3. JobCreator:根据任务的 tag 来创建任务。
  4. 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 - JobService常用场景分析 概览 JobScheduler是android系统提供的一个任务执行框架,通过JobScheduler我们可以根据不同的策略调度任务的执行。 例如: 指定任务可以在指定的网络下执行 指定任务只在充电的状态下进行 设置任务的截止时间 指定延迟一段时间后执行任务 指定任务在手机空闲的情况下执行 如果app被杀死则无法最终执行任务,如果有重启后需要继续执行这种需要建议使用WorkManager 使用 基本使用 创建自定义JobService并在manifest中配置 class ExeTaskAfter2Se 阅读详情

相关推荐

Android 9.0 JobScheduler(三) 从Job的创建到执行

上一篇文章:JobScheduler(二)——JobScheduler框架介绍及JSS的启动 现在来看看Job的添加流程,当应用程序通过JobScheduler.schedule(jobinfo)添加一个Job,到它最终完成调度,这个过程是怎样的呢?现在就来看看这个过程。 首先来看其时序图: 受限于图片大小,以上时序图中对一些流程进行了省略,只画出了重要的步骤,不过所有的步骤,都会在下面的内容分...

FightFightFight的博客 5615

android-job 调度任务 框架简介

Android-job 链接地址 JobManger 策略式调用不同策略实现调度任务,单例类,通常在app中进行初始化; JobManager.create(this).addJobCreator(new XXXJobCreator()); 初始化create JobManager时: 创建JobCreatorHolder, JobExecutor, JobS...

MrJarvisDong的博客 3510

Android JobService和JobScheduler 原理剖析

请支持原创~~ 版本基于:Android R 前言 最近在研究Iorap 的时候碰到了JobScheduler,这套机制是在Android L中就提出来的,而之前没有使用到也就不知其存在。简单过滤了下framework 的代码,发现虽然是一个小模块,却是五脏俱全、环环相扣。由于时间原因,本文主要结合实际情形简单分析JobScheduler 的实现过程。 框架图 本图来源:https://blog.youkuaiyun.com/allisonchen/article/details/792...

私房菜 4340

Android-job

android-job是一个可以在后台进行延时处理的库。即使你没有操作,你的应用也可以根据你的设置定期执行任务 使用 1.在build.gradle中引入 dependencies { ... implementation 'com.evernote:android-job:1.2.6' } 2.新建类继承自Job,重写其onRunJob方法,并在其中编写你想要执行的任...

小法老沙拉维的博客 1055

Android中实现JobScheduler的Demo

Android中实现JobScheduler的Demo

Android-Job用于在后台处理作业的Android库

Android-Job 用于在后台处理作业的Android库

Android Job 终极指南:JobManager、JobRequest 与 Job 的完美协作揭秘

Android Job 是一个强大的后台任务调度库,专为简化Android应用中的后台任务管理而设计。这个开源库通过JobManager、JobRequest和Job三个核心组件的完美协作,为开发者提供了高效可靠的后台任务解决方案。无论你是新手还是经验丰富的开发者,掌握这个库都能让你的应用在后台处理方面更加出色。 ## 🎯 核心组件深度解析 ### JobManager:任务调度的大脑 J

gitblog_00649的博客 526

Android使用任务调度JobScheduler的代码例子

Android使用任务调度JobScheduler的代码例子。用于演示Android5.0新增的任务调度机制,通过代码对JobInfo、JobScheduler、JobService这三个新工具进行了使用说明。

Android-Job 与 WorkManager 终极对比:如何选择最适合你的后台任务框架

Android 应用开发中,后台任务管理是确保应用高效运行的关键环节。**Android-Job** 作为一款专注于后台任务调度的库,与 Google 官方推出的 **WorkManager** 框架各有优势。本文将深入对比两者的核心功能、适用场景和性能表现,帮助开发者快速选择最适合项目需求的解决方案。 ## 🚀 核心功能对比 ### 1. 兼容性覆盖 Android-Job 设计之初就注重

gitblog_01104的博客 918

脑影像分析入门:如何用一般线性模型(GLM)处理fMRI数据?

本文为神经影像研究入门者详细解析了如何运用一般线性模型(GLM)处理fMRI数据。文章从GLM的核心原理出发,逐步拆解了从实验设计、构建稳健设计矩阵、模型估计与统计推断,到高阶分析及多重比较校正的全流程,并指出了常见陷阱与结果解读要点,是掌握fMRI数据分析基础的关键指南。

weixin_29091445的博客 400

Datawhale~数据挖掘实践之序列问题处理~天池·资金流入流出预测-挑战Baseline~Day01~数据探索与分析

写在前面✍ 本系列笔记基于天池平台上“资金流入流出预测-挑战Baseline”学习赛,记录如何完整的打一次数据挖掘类比赛。同时,该比赛属于序列建模问题,希望学习完成这个任务,可以对序列问题的处理有一定的独立思考能力和实践操作能力,可以将所学理论,用编码的形式和实际的问题得到深入。 第一篇,EDA Content: 初步了解赛题及数据 1.1 任务 1.2 用户基本信息数据 1.3 用户申购赎回数据 1.4 收益率表 1.5 银行间拆借利率表 1.6 提交格式 1.7 评分指标 EDA 1 初.

小卜妞的博客 2358

kotlin协程Job、CoroutineScope作用域,Android

一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。结果1-a: 5 - tid:22。一般编程的技法,比如,在Android中,假设在主线程中实现了一个函数,但该函数是耗时操作,毫无疑问,需要将这个函数的实现切入非主线程中操作,那么可以设计一种托管的函数,在托管的函数里面干脏活,处理完成后,把结果抛到主线程。

Zhang Phil 915

从逻辑门到RISC-V指令:ALU设计实战与Verilog实现

本文详细介绍了从逻辑门到RISC-V指令集的ALU设计实战与Verilog实现方法。通过构建1位ALU并扩展至64位,深入解析了RISC-V指令集的算术逻辑单元实现技巧,包括加法器设计、零标志检测和溢出检测等关键功能。文章还分享了Verilog代码优化、流水线设计和常见问题调试的实用经验,为开发者提供了一套完整的ALU设计解决方案。

weixin_29214335的博客 185

如何使用Evernote的android-job库轻松实现Android后台任务处理

Evernote的android-job是一个强大的Android后台任务处理库,它能够帮助开发者轻松管理应用中的后台任务,支持从Android 4.0(Ice Cream Sandwich)到最新版本的系统,自动适配不同系统版本的JobScheduler、GcmNetworkManager或AlarmManager。无论是定时同步数据、后台备份还是定期提醒,android-job都能提供可靠的解

gitblog_00031的博客 595

不用加速器!Google Earth Pro登录失败自救手册:从服务器连接到地图加载的完整排错流程

本文详细解析了Google Earth Pro登录失败的常见问题及解决方案,包括服务器连接失败、地图加载异常等。通过基础排查、内置修复工具使用和高级配置调整,帮助用户无需加速器即可解决启动问题、黑屏和转圈圈等困扰,提升软件使用体验。

weixin_29227425的博客 482

Spring Boot:如何快速搭建一个高性能微服务架构?

通过本文的详细步骤,我们成功搭建了一个高性能的微服务架构。Spring Boot 和 Spring Cloud 提供了强大的工具链,使得开发者能够快速实现服务注册与发现、负载均衡、熔断器与降级机制等功能。同时,通过数据库连接池、Redis 缓存和异步处理等优化手段,进一步提升了系统的性能和可靠性。希望本文能够帮助你快速入门 Spring Boot 微服务架构的搭建,并为实际项目提供参考。如果你有任何问题或建议,欢迎在评论区留言!

shrgegrb的博客 1013

Android Priority Job Queue:一个专门为Android轻松调度任务的工作队列

跳槽季整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。本文在开源项目:【

m0_60607971的博客 843

基于YOLOv11的农作物病虫害检测系统设计与实现

我们使用公开的IP102病虫害数据集作为基础,该数据集包含102种病虫害类别,覆盖水稻、小麦、玉米等多种主要农作物。图像数量:75,222张类别数:102图像分辨率:从640×480到4000×3000不等标注格式:PASCAL VOC格式此外,我们还收集了部分田间实际拍摄的图像以增强模型泛化能力。

YOLO 595

Shanghai Job: Senior Android Engineer 高级安卓工程师

高级安卓工程师 为全球著名品牌开发尖端产品应用   *工作地点上海 * 年薪30-40万 *已有成熟稳定的开发团队   该公司为欧美著名企业,从做教育起家发展到现在已经有五十多年的历史,为全球各个国家的客户和个人提供线上线下的教育相关服务。在上海,他们很早便成立了一个全球技术研发中心,为主要是欧洲的客户服务。此研发中心由两百多杰接近三百人的规模,由中外籍员工组成。   由于公司扩

u025037147的专栏 330

ANFIS实现数据非线性回归附Matlab代码

在本文中,我们将介绍如何使用Matlab实现基于MSE的ANFIS非线性回归,并提供相应的源代码。ANFIS是一种融合了模糊逻辑和神经网络的方法,它可以通过学习数据集中的模式来构建一个模糊推理系统。ANFIS的训练过程基于最小化MSE,以提高模型的拟合能力。通过上述代码示例,我们可以使用基于MSE的ANFIS模型对数据进行非线性回归,并获得相应的预测结果。在示例中,我们定义了一个包含两个样本的新输入数据集 X_new,然后使用训练好的ANFIS模型进行预测,并将结果存储在变量 Y_pred 中。

2301_79326588的博客 473

SAP ABAP 缓冲同步揭秘——从 DDLOG 表到 RSDBBUF3 的完整实践指南

DDLOG 看似一张不起眼的系统表,却承担着 SAP 多实例环境下的数据一致性重任。通过掌握其字段意义、解析方法及周边监控工具,你可以在性能与一致性之间找到最佳平衡;通过精细化的参数管理与主动刷新策略,更能在关键业务场景中确保“数据永远是最新的”。愿本文能成为你日常排障与架构决策的参考手册。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 312

终极指南:如何快速上手 Android-Job 后台作业库

Android-Job 是一个强大的 Android 后台作业处理库,它能够智能地根据 Android 版本自动选择最合适的调度机制:在 Android 5.0+ 使用 JobScheduler,在 Android 4.x 使用 GcmNetworkManager,在其他版本使用 AlarmManager。这个统一的解决方案让开发者无需为不同 Android 版本编写复杂的兼容代码。🚀 ##

gitblog_00910的博客 1098

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 跨浏览器问题的五种解决方案
下一篇: 为什么 Android 开发者都应该尝试一下 Anko?
极光推送
博客等级 码龄14年 109粉丝 108原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值