Android项目笔记:JobService

JobService的使用及源码分析 Google在Android 5.0中引入JobScheduler来执行一些需要满足特定条件但不紧急的后台任务,APP利用JobScheduler来执行这些特殊的后台任务时来减少电量的消耗。本文首先介绍JobSerice的使用方法,然后分析JobService的源码实现。 JobService的使用 使用JobScheduler的时候需要把待执行的后台任务封装到JobService中提交。下面 阅读详情
在Android5.0之后,系统为我们提供了一个后台定时任务,在特定的条件下触发。它就是JobService。
JobService在满足条件的情况下,会在APP的主线程中执行任务。因此需要我们注意不能直接执行耗时的任务。

JobService的使用首先要先申请一个保护权限 "android.permission.BIND_JOB_SERVICE" ,否则系统将跳过这个JobService。
<service android:name="MyJobService"
              android:permission="android.permission.BIND_JOB_SERVICE" >

JobService 继承自 Service,使用上也相对简单,涉及到的主要方法有以下几个:

 public class JobSchedulerService extends JobService {
    @Override
    public boolean onStartJob(JobParameters params) {

        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {

        return false;
    }

 }

boolean onStartJob(JobParameters params) 

    第一个需要重写的方法,该方法在Job满足条件时,开始被调用。我们需要在该方法中实现我们自己的需求逻辑。需要特别注意的是,这个方法是执行在应用的主线程里面的,所以要避免直接使用耗时操作。
该方法返回一个布尔值,返回true表示该job需要继续运行,如果我们选择返回true,job会一直处于存活状态直到我们手动调用JobFinished告诉系统任务完成了或者job设定的条件不再满足了。比如:我们的jobschedule设定了setRequiresCharging(true),那么当我们不再充电的时候,该job就会被立即停止。这个时候 onStopJob(JobParameters)就会被调用。如果返回的是false,则表示该job在return的时候已经结束,并且onStopJob(JobParameters) 不会被调用。

    该方法传入一个JobParameters参数,该参数表示Job的配置信息,用于标识正在运行中的job,比如在调用jobFinished(JobParameters, boolean)时传入。


boolean onStopJob (JobParameters params)

    该方法会在系统决定停止该job时调用,不管你是否调用了jobFinished。
    该方法传入JobParameters ,这个与onStartJob中的相同。该方法返回一个布尔值,返回true用来告诉JobManager你是否要重试该job,重试的条件在创建job的时候定义。返回false的话表示该job将完全结束。不管我们选择返回什么值,这一次的job将必定会被停止执行。


void jobFinished (JobParameters params, boolean wantsReschedule)

    调用该方法用来手动停止某一个job,我们可以通过传入true给wantsReschedule来表示希望重新计划该job。我们可以通过setBackoffCriteria 来调整重试的策略。这里不展开。


看完JobService的主要方法,接下来看看如何构建并配置任务:

首先获取到schedule:

JobScheduler js = context.getSystemService(JobScheduler.class);

接下来我们使用builder模式创建一个JobInfo,设置相应的属性和配置项,这些配置项决定了Job什么时候会被触发。

JobInfo jobInfo = new JobInfo.Builder(OOBEConstant.JB_ID_SUPPORT_CHECK, new ComponentName(context.getPackageName(), OOBEQueryIfSupportJobService.class.getName()))
        .setPersisted(true)
        .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)
        .build();

完成配置之后我们就可以安排执行任务了:

js.schedule(jobInfo);

可以看到为了满足我们的条件,关键还是在构建JobInfo的时候设置符合我们要求的属性,这里我贴上一些常用的:

addTriggerContentUri(JobInfo.TriggerContentUri uri)
添加监听一个Uri,如果发生改变就会触发job

setBackoffCriteria(long initialBackoffMillis, int backoffPolicy)
设置重试策略

setMinimumLatency(long minLatencyMillis)
设置job延迟的最短时间

setPersisted(boolean isPersisted)
设置重启后是否生效

setRequiredNetworkType(int networkType)
设置job需要的网络类型

JobScheduler 用于整体的调度,它主要涉及以下几个方法:

schedule(JobInfo job)
安排执行一个job,它会返回一个int值,RESULT_SUCCESS表示成功安排,RESULT_FAILURE表示失败。

cancel(int jobId)
取消一个特定的job

cancelAll()
取消由该应用所有已经计划的job

值得注意的是,当job在运行的时候,系统会给APP一个wakelock,也就是它保证了我们的job在运行的时候设备会一直处于唤醒的状态。

下面贴主要代码:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class ShowNotificationJobService extends JobService {

    @Override
    public boolean onStartJob(JobParameters params) {
        Intent intent = new Intent(START_NOTIFICATION);
        intent.setClass(this, FlowController.class);
        sendBroadcast(intent);
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        return false;
    }

    public static void schedule(Context context){

        long startupTime = Utils.getPreferences(context).getLong(Constant.SP_PARAM_TIME,0);
        long latency = Constant.NOTIFICATION_DELAY - (System.currentTimeMillis() - startupTime);
        JobScheduler js = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
        JobInfo.Builder builder = new JobInfo.Builder(Constant.JB_ID_NOTIFICATION_CHECK, new ComponentName(context.getPackageName(), ShowNotificationJobService.class.getName()))
                .setPersisted(true)
                .setMinimumLatency(latency)
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
        if(latency > 0){
            builder.setMinimumLatency(latency);
        }

        js.schedule(builder.build());
        if( result == JobScheduler.RESULT_SUCCESS ){
		Log.i(TAG, "scheduled success");
	}
	else {
		Log.i(TAG, "scheduled failed");
	}

    }

}



Android - JobService常用场景分析 概览 JobScheduler是android系统提供的一个任务执行框架,通过JobScheduler我们可以根据不同的策略调度任务的执行。 例如: 指定任务可以在指定的网络下执行 指定任务只在充电的状态下进行 设置任务的截止时间 指定延迟一段时间后执行任务 指定任务在手机空闲的情况下执行 如果app被杀死则无法最终执行任务,如果有重启后需要继续执行这种需要建议使用WorkManager 使用 基本使用 创建自定义JobService并在manifest中配置 class ExeTaskAfter2Se 阅读详情

相关推荐

Android JobService和JobScheduler 原理剖析

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

私房菜 4340

【Android Service】JobService

JobService这个东西或许我们真的没有接触过,但是他的出现解决了特定的问题:比如电量优化、服务广播多重绑定执行任务等。公司的业务逻辑中就用到了这个Service,趁着空闲来总结篇。正好完善下自己的Service知识体系。 1、故事引入:JobService出现的背景 A:假如现在有个需求…我需要做一套推送逻辑,从服务器获得数据后向通知栏推送消息。 B:这个so easy,我搞个普通的service就ojbk了。service中做请求,请求解析完毕后台推送。 A:那好吧,我要添加需求了,为了友好用.

dev晴天的博客 5157

Android源码面试宝典之JobScheduler从使用到原理分析(三)【JobService、JobInfo】

本文,从Job任务的创建,到如何与JSC(JobServiceCotext)关联,到具体任务的绑定、执行进行了源码探索,相信大家到现在为止,对于JobScheduler的庐山真面目,脑海中已经有了些许自己的轮廓。但是,我们也知道,目前为止,仅仅是任务的创建、任务的执行原理我们了解、学习到了,但是任务何时执行的?约束条件如何监控job的?这些还未讲到。别着急,下一节,我们一起继续探索源码,解析其中的奥秘。

itbird的专栏 1390

Android libsqlite.so not found ,“does not require android.permission.BIND_JOB_SERVICE permission”

1、问题描述 本人使用的是融云SDK做的消息即时通讯,我的手机是Android6.0即Api 23,用起来是OK的,可测试的时采用Android 8.0时,手机就启动不了,然后报错信息如下: 解决方案: 问题1参照如下教程解决,博主很良心  融云、环信dlopen failed: library "libsqlite.so" not found 问题2截图如下 报错: java.l...

crazyZhangxl的博客 4476

Android后台开发之JobService实战示例

JobService是Android系统中用于管理后台任务执行的核心组件之一,自Android 5.0(API 21)引入以来,成为开发者优化应用后台行为的重要工具。其核心作用是将任务调度交由系统统一管理,从而提升资源利用率、延长电池续航,并确保任务在合适的系统条件下运行。在传统后台执行模型中,Service组件虽然能够执行长时间运行的任务,但缺乏对系统状态的感知能力,容易造成资源浪费和性能下降。

weixin_34064233的博客 1012

别再手动算考勤了!教你用Python+企业微信API自动生成月度报表

本文介绍如何利用Python和企业微信API构建自动化考勤分析系统,实现从数据获取到可视化报表生成的全流程自动化。通过企业微信打卡接口获取数据,使用Pandas进行高效清洗和分析,并生成Excel和HTML格式的报表,大幅提升考勤统计效率。系统支持智能判定考勤状态,如迟到、早退等,并可通过定时任务实现月度自动化运行。

weixin_27875131的博客 290

Android Fk: JobService的使用解析

某个时间点或者满足某个特定的条件时去执行某个任务时可以使用JobService来实现,一从API19起,使用AlarmManager,setRepeating定时请求并不能保证时效的准确,在5.0以后,Google推出了一个JobService,用来执行一些并非即时执行的后台进程。 一、使用方法: 1.新建自己的JobService public class DemoJobSer...

TaylorPotter的博客 1599

Ubuntu22.04安装ROS2 —— ROS2 humble 详细图文教程

本文详细介绍了如何在Ubuntu22.04(Jammy)系统下配置ROS2环境,安装RO2软件包,并验证安装成功。ROS2的版本是Humble Hawksbill。:ROS是一个开源的,提供硬件抽象、设备驱动、库、工具和通信机制,支持模块化开发与集成,广泛用于机器人控制和自动化应用。ROS2 相较于 ROS1 在架构设计、通信机制和平台支持等方面做出了改进。ROS1 采用集中式主节点(Master)进行节点间通信,存在单点故障风险,且实时性和跨平台支持较弱。

weixin_49649078的博客 8816

Android JobService组件简要

JobService简介: JobService是Android L版本加入的组件,JobService是继承自Service的抽象类,为Service的加强和优化. 由系统统一管理和调度,在特定场景下(网络状态等等)使用JobService更加灵活和省心。 可以在应用退出后,重新启动应用后,系统将PersistableBundle数据回调到JobService对原来的事务进行处理。 J...

AnongChang 1227

LinuxCNC---在PC端显示开发板LinuxCNC界面

  今天在调试开发板时,执行开发板上的linuxcnc指令,总是出现如下报错 LINUXCNC - 2.9.0~pre0 application-specific initialization failed: couldn't connect to display "192.168.137.3:1" Error in startup script: invalid command name "image" while executing "image create photo -file $f/$i

中华田园巨龙 3471

Hypermesh2021实战:塑料圆盘结构化网格划分全流程(附避坑指南)

本文详细介绍了使用Hypermesh2021进行塑料圆盘结构化网格划分的全流程操作,包括几何预处理、网格生成策略及质量验证。特别针对工程实践中常见的12个典型问题提供解决方案,帮助用户提升CAE仿真分析的精度和效率。

weixin_29294597的博客 319

jobservice android,如何检查JobService是否在android中运行?

我在我的项目中使用JobService。运行良好。但有时服务停止了。它不会再次重新启动。因此,如果没有运行,我将尝试分层JobService。但是我不知道如何检查JobService是否已经运行。请让我知道如何检查JobService是否正在运行。我的工作服务课程:@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public class JobSer...

weixin_36090062的博客 411

RISC-V V向量指令集学习笔记——访存指令

RISC-V V向量指令集学习笔记——访存指令

qq_41724469的博客 5136

Android学习使用JobService

Android学习使用JobService关于编写LocationJob继承JobService使用 关于   JobService是Android L时候官方加入的组件。适用于需要特定条件下才执行后台任务的场景。 由系统统一管理和调度,在特定场景下使用JobService更加灵活和省心,相当于是Service的加强或者优化。   因为要开发后台持续定位功能,然后就想着之前使用百度地图定位都是前台定位,所以还需要学习一下,顺便记录一下。 编写LocationJob继承JobService   写一个简单地打

Tobey_r1的博客 1567

VCS2018在Ubuntu20 18安装步骤

之前在Ubuntu20上下VCS,花了好几天时间,本来想写博客避免以后重复劳动。但由于各种原因拖了一两个月,这次由于疫情原因,期末考试推迟,所以就再次在Ubuntu18上下了VCS,顺便写博客记录。 以下VCS2018安装方法适用于 Ubuntu20、Ubuntu18,亲测可用。其他Linux发行版没试过,但应该步骤差不多。 文章目录安装包安装步骤1、建立安装路径,更改权限2、运行安装器进行安装3、生成License文件4、设置环境变量5、验证License6、启动lmgrd验证软件是否安装成功dvever

s-stone的博客 3万+

大数据领域数据产品的交通运输行业应用

您是否经历过早高峰被堵在桥上,看着导航显示“前方5公里缓行”却无能为力?是否见过货车司机绕远路导致成本飙升?这些“交通痛点”的背后,是传统交通管理依赖经验决策的局限。本文将聚焦“大数据数据产品”这一核心工具,从技术原理到实际应用,全面解析它如何为交通运输行业“开天眼”,解决从城市拥堵到物流效率的一系列难题。本文将按照“问题引入→概念拆解→技术原理→实战案例→应用场景→未来趋势”的逻辑展开,用生活化比喻降低理解门槛,用代码和数学模型提升专业性,最终帮您建立“大数据+交通”的完整认知框架。交通数据。

操作系统内核探秘的博客 237

jobservice android,Android 5.0+ JobService 的使用

1、新建一个Service继承 JobService@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public class MyJobService extends JobService {private int mJobId = 0x00200;private final long requestInterval = 5*60*1000;//间隔...

weixin_34146759的博客 304

数据库系统工程师软考备战:第三篇 - SQL语言深入解析与应用

​​创建表​​​修改表​​​删除表​。

Programming Talk 122

JobService的使用

JobService的使用

Mr_Tony的专栏 1635

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Android使用JobService实现后台服务

前言 在Android经常要实现定时服务,定时某个时刻推送消息或者更新数据,一般我们可能是开启Service,在Service中使用AlarmManager,setRepeating定时请求,但是从API19起,并不能保证时效的准确,在5.0以后,Google推出了一个JobService,用来执行一些并非即时执行的后台进程。使用 在JobService中有两个抽象方法onStartJob(Jo

dai的博客 2264

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

通过JobService进行app保活

公司需要对安卓播放机上的播放软件进行意外退出自动保活,除了添加崩溃自启外,还使用了JobService进行定时检测软件是否正常运行。不正常则自动启动。这里做个记录.。 安卓播放机 的安卓版本为7.1.2。 先是AliveJobService public class AliveJobService extends JobService { private final static String TAG = "AliveService"; // 告知编译器,这个变量不能被优化 pri

qq524811025的博客 798

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android7.0以后你不知道的JobService坑

JobService是什么这里就不多介绍了; JobService是Android5.0以后出来的,随着Android版本的发布,google对系统的性能要求越来越高;从7.0以后对后台系统服务进行了限制(参阅官方的7.0行为变更后台优化);最近在项目中发现了以前写的心跳包机制在某些机型上无法心跳的问题,经过问题排查发现是系统版本的差异,在Android7.0以后JobService无法正常按照设置的执行周期执行后台任务。之前的代码: public void startHeartbeat(Context

Tiger的专栏 1195

JobService

JobService:     Android 5.0以后,Google推出了一个JobService,用来执行一些并非即时执行的后台进程。 场景:     需要在稍后的某个时间点或者当满足某个特定的条件时执行一个任务。 使用:     在JobService中有两个抽象方法on...

lzlcharm的博客 486

Android-JobService

JobService是Service的一个强化版,本质属于Service,因此,添加一个JobService需要到清单文件中注册Service组件。JobService的创建过程:(1)继承JobService(2)重写回调onStartJob和onStopJob (必须)

qq_50726065的博客 860
上一篇: Android中注解的简单使用
parallelyk
博客等级 码龄15年 5粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值