Android JobService启动系统源码分析

2024-06-11 06:12

本文主要是介绍Android JobService启动系统源码分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

以下就JobService的执行流程,系统层实现进行详解

入口点在JobScheduler.scheduler

系统层JobScheduler是个抽象类,它的实现类是JobScheduler

mBinder,一看就知道这里面肯定是跨进程了。它的服务端在JobSchedulerService里面,具体

为什么请看系统服务器启动流程相关文章,这里不做过多解释;

我们看到这个方法就是从客户端远程调用入口,接着就进入了JobSchedulerService服务

在进入下一步之前会先检查用户自定义的服务是否指定android.permission.BIND_JOB_SERVICE

这个权限,如果没有就直接抛出异常,这就是为什么在manifest中注册服务器的时候一定要配置该权限的原因

这里面做的一些场景判断比较多,这里贴图只放了重要了地方;

以下大概是如果任务已经存在,就采取相应措施处理,这里直接讲解不存在的情况

要搞懂这里面的,就得搞懂mController里面存的是什么,我们可以看看下下张图,它是在构造函数的中添加的,基类都是StateController,主要是用于实现各种条件约束的。比如网络、电量等条件约束。maybeStartTrackingJobLocked这个方法是通知各个条件约束控制器,有新的任务需要监听,如果有必要就跟踪他们的状态,当满足条件的时候就通知。

到这里JobService的启动相关信息已经添加到了系统服务中,并且如果指定要任务是持久化的,系统还会将任务信息记录都文件中保存。

接下来我们,进入网络状态控制器里面看看他是如果监听网络变化并通知启动我们自定义的JobService的

在构造时候注册了网络状况变化回调

mStateChangedListener这里其实就是JobSchedulerService

发送CHECK_JOB消息后,会检查所有未启动的任务,如果满足的条件,就将其加入到即将运行的队列中去,等待去执行

这个方法里面会根据系统的内存紧张级别对同时执行的任务数量做个动态调整

最终会走到下面这个方法,来启动用户自定义的服务,到这里我们自己定义的服务启动了,接下来我们看下onStartJob是如何被触发的

接下来会执行了JobEngineService

到此就执行到了onStartJob

注意,如果onStartJob和onStopJob返回true,它会继续等待下次满足了约束条件继续执行,false下次就不再执行。

到此分析完毕,如果有错误的地方麻烦指出,谢谢。

这篇关于Android JobService启动系统源码分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1050379

相关文章

基于Go语言实现Base62编码的三种方式以及对比分析

《基于Go语言实现Base62编码的三种方式以及对比分析》Base62编码是一种在字符编码中使用62个字符的编码方式,在计算机科学中,,Go语言是一种静态类型、编译型语言,它由Google开发并开源,... 目录一、标准库现状与解决方案1. 标准库对比表2. 解决方案完整实现代码(含边界处理)二、关键实现细

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

PostgreSQL 序列(Sequence) 与 Oracle 序列对比差异分析

《PostgreSQL序列(Sequence)与Oracle序列对比差异分析》PostgreSQL和Oracle都提供了序列(Sequence)功能,但在实现细节和使用方式上存在一些重要差异,... 目录PostgreSQL 序列(Sequence) 与 oracle 序列对比一 基本语法对比1.1 创建序

使用Python和SQLAlchemy实现高效的邮件发送系统

《使用Python和SQLAlchemy实现高效的邮件发送系统》在现代Web应用中,邮件通知是不可或缺的功能之一,无论是订单确认、文件处理结果通知,还是系统告警,邮件都是最常用的通信方式之一,本文将详... 目录引言1. 需求分析2. 数据库设计2.1 User 表(存储用户信息)2.2 CustomerO

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

Linux系统调试之ltrace工具使用与调试过程

《Linux系统调试之ltrace工具使用与调试过程》:本文主要介绍Linux系统调试之ltrace工具使用与调试过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、ltrace 定义与作用二、ltrace 工作原理1. 劫持进程的 PLT/GOT 表2. 重定

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l