深入PMS源码(三)—— PMS中intent-filter的匹配架构

2023-11-01

1、简介

由前面深入PMS源码(一)—— PMS的启动过程和执行流程深入PMS源码(二)—— APK的安装和卸载源码分析两篇文章知道,无论是Android系统启动后执行的PMS启动,还是使用PackageInstaller安装APK的过程,最终都会使用PackageParser扫描相应的apk文件,将扫描提取的信息保在Package对象中,扫描完成后会回调PMS中方法将扫描获取的四大组件信息转换保存在PMS属性中,主要使用ActivityIntentResolver、ServiceIntentResolver、ProviderIntentResolver保存信息,这里会有两个问题:

  1. 系统是按照何种方式保存这些属性的对应关系?保存这些属性又是如何使用的?
  2. 我们启动Activity只是创建了Intent对象,然后调用Context中的启动方法而已,那系统是如何查找到目标活动的信息的呢?

2、PMS保存IntentFilter

下面带着这两个问题,从源码的角度探讨下PMS中的intent-filter的匹配架构,接着PMS的启动过程中分析,对四大组件处理代码如下,这里已对Activity的处理为例分析

N = pkg.activities.size();
3503            r = null;
3504            for (i=0; i<N; i++) {
   
3505                PackageParser.Activity a = pkg.activities.get(i);
3506                a.info.processName = fixProcessName(pkg.applicationInfo.processName,
3507                        a.info.processName, pkg.applicationInfo.uid);
3508                mActivities.addActivity(a, "activity"); //调用ActivityIntentResolver.addActivity()
}

// ActivityIntentResolver.addActivity()
public final void addActivity(PackageParser.Activity a, String type) {
   
    mActivities.put(a.getComponentName(), a); // 1、获取内部的Component对象,在Activity会自动创建Component对象
    final int NI = a.intents.size();
    for (int j=0; j<NI; j++) {
   
        PackageParser.ActivityIntentInfo intent = a.intents.get(j); // 获取Activity中设置的intent
        addFilter(intent); // 添加Intent过滤
    }
}

从解析得到的Package对象中获取每个创建的Activity对象,然后调用ActivityIntentResolver.addActivity()方法将Activity对象保存在ActivityIntentResolver.mActivities集合中,在程序的最后几行代码中会遍历a.intents的集合,取出每个ActivityIntentInfo信息调用addFilter()添加Intent过滤信息,这里的ActivityIntentInfo是在PackageParser解析标签中创建的对象并添加到a.intents的集合中,也就是说每个Activity标签下定义的标签都对应一个ActivityIntentInfo对象,且所有的对象都保存在a.intents的集合中,在介绍addFilter()方法前先介绍下IntentResolver类;

  • IntentResolver
  1. 作用:IntentResolver主要用于保存程序中设置的和相应的ActivityRecord的对应关系,并在使用时提供查找机制
  2. 实现原理:IntentResolver会按照中的每个特性(如action、type)等分别创建HashMap,并在解析时保存相应的对象,在查找时取出要匹配的Component对象的action、type,然后再各自的ArrayMap中获取其保存对象的集合,此时获取到的是多个集合其中包含重复信息,然后对所有的集合取交集并去重,最终得到完全匹配的对象;
  3. IntentResolver属性如下:
public abstract class IntentResolver<F extends IntentFilter, R extends Object> {
   
private final ArraySet<F> mFilters = new ArraySet<F>(); //保存所有的intent对应的匹配对象
private final ArrayMap<String, F[]> mTypeToFilter = new ArrayMap<String, F[]>(); //保存Type 匹配的Intent集合
private final ArrayMap<String, F[]> mBaseTypeToFilter = new ArrayMap<String, F[]>();
private final ArrayMap<String, F[]> mWildTypeToFilter = new ArrayMap<String, F[]>();// 保存所有带“*”通配符类型
private final ArrayMap<String, F[]> mSchemeToFilter = new Arra
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入PMS源码(三)—— PMS中intent-filter的匹配架构 的相关文章

随机推荐

  • 顺序表基本操作

    文章目录 1 顺序表插入元素 2 顺序表删除元素 3 顺序表查找元素 4 顺序表更改元素 1 顺序表插入元素 向顺序表中插入数据元素 根据插入位置的不同 可分为以下 3 种情况 插入到顺序表的表头 在表的中间位置插入元素 尾随顺序表中已有元
  • TCP/IP详解 卷1:协议 学习笔记 第十七章 TCP:传输控制协议

    TCP提供一种面向连接的 可靠的字节流服务 面向连接意味着两个使用TCP的应用 通常是一个客户一个服务器 在彼此交换数据前必须先建立一个TCP连接 在一个TCP连接中 仅有两方进行彼此通信 广播和多播不能用于TCP TCP提供可靠性的方法
  • Unity3D Animation、Animator和AnimationClip

    文章目录 Animation 字段 方法 Animator 字段 方法 AnimationClip 字段 方法 Animation 单一动画 一般使用在单一动画播放 占用资源小 字段 名称 作用 animatePhysics 如果打开这个选
  • qt中connect函数探究

    综合了一下网上资源 整理得出 QT 是一个跨平台的 C GUI 应用构架 它提供了丰富的窗口部件集 具有面向对象 易于扩展 真正的组件编程等特点 更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT 库的基础之上
  • Linux OOM killer机制介绍

    1 概念描述 Linux内核内存管理使用OOM killer Out Of Memory killer 机制 在系统内存不足时 选择性杀死一些进程以释放内存 以使系统继续运行 2 OOM killer产生的原因 2 1 malloc 内存分
  • 解决js的小数点问题

    diff fee should total fee add fee toFixed 2 console log diff fee
  • MATLAB----矩阵的运算

    文章目录 1 获取矩阵的行列数 1 1 获取矩阵的行和列 1 2 把矩阵的行和列分别赋值给变量 2 矩阵的转置和逆矩阵 2 1 矩阵的转置 2 2 矩阵的逆矩阵 3 特征值和特征向量 4 加 减 乘 除 乘方 运算 4 1 加法 4 2 减
  • Blender学习笔记 —— 资源整理(持续更新)

    从准备入门到跨过门槛 3D神器Blender 教程来了 一篇对Blender 3D功能入门介绍操作性质的文章 斑斓中国 Blender中文社区 关于Blender的各类资源很全 斑斓中国的优酷频道 都是Blender教学视频 创意齿轮CGD
  • Android开发从初级到高级学习路线

    Android开发需要具备的知识 编程基础 数据结构 C语言 Java语法 初级 首先需要购买一本Android入门的书籍 把Android官方文档中的training和guide看一遍 技术要求 比如四大组件如何使用 如何创建Servic
  • 微信小程序开发(七) view 组件

    view 组件的示例代码之横向布局和纵向布局 wxml
  • ggplot2读书笔记13:第十章 数据变换

    Data Transformation 10 1 简介 通常情况下 除了整理数据之外 我们还需要把原始数据做一些数据变换 聚合等 这时就要使用到dplyr包 本章中我们学习dplyr中四个重要的函数的用法 filter mutate gro
  • 如何选择合适的渗压计?

    渗压计的用途 渗压计是测量构筑物内部渗透 孔隙 水压力的传感器 一般直接测得水压力 kPa 再根据液体压强公式可换算为水位 渗压计应用非常广泛 可用于测量大坝坝体渗流压力 浸润线 绕坝渗流压力 坝基扬压力 尾矿库测压管水位 干孔深度 边坡
  • osg学习(七十四)Type mismatch in arithmetic operation between ‘vec2‘ and ‘int‘

    可能是手机端语法检查更严格 glsl语句是这样的 再桌面端执行没有问题 在手机端执行会提示上述错误 vec3 tmpNormal osg NormalMatrix osg Normal tmpNormal normalize tmpNorm
  • Redis02-高级使用

    本文基于 Redis6 2 7 和 CentOS 7 一 事务 首先要告诉大家 redis的事务和mysql的事务是不一样 1 1 事务指令 multi 开启事务 exec 提交事务 discard 回滚事务 一个事务从开始到执行会经历以下
  • SSE Intrinsics各函数介绍

    SIMD相关头文件包括 include
  • 图像矫正与车牌识别资料整理

    图像矫正 http blog csdn net zhtsunday article details 52094745 换了别的图片无法识别了 http download csdn net detail linoi 6812153 车牌识别图
  • pytorch损失函数(nn.L1Loss、nn.SmoothL1Loss、nn.MSELoss 、nn.CrossEntropyLoss、nn.NLLLoss)

    损失函数 是编译一个神经网络模型必须的两个参数之一 另一个是优化器 损失函数是指用于计算标签值和预测值之间差异的函数 常见的有多种损失函数可供选择 典型的有距离向量 绝对值向量等 nn L1Loss L1Loss 计算方法比较简单 原理就是
  • python,AttributeError: module 'random' has no attribute 'randint'

    错误 AttributeError module random has no attribute randint 原因 把random py作为文件名 和系统有冲突 修改文件名后 运行
  • C++11 auto类型说明符如for(atuo &x : s)

    include
  • 深入PMS源码(三)—— PMS中intent-filter的匹配架构

    1 简介 由前面深入PMS源码 一 PMS的启动过程和执行流程和深入PMS源码 二 APK的安装和卸载源码分析两篇文章知道 无论是Android系统启动后执行的PMS启动 还是使用PackageInstaller安装APK的过程 最终都会使