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

本文详细介绍了Android系统包管理服务(PMS)如何保存IntentFilter,并探讨了IntentFilter的查找匹配过程。从解析APK时保存Activity信息到IntentResolver的运作原理,再到查询匹配Intent的方法,阐述了PMS如何根据Intent精准匹配目标组件。
摘要由CSDN通过智能技术生成

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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值