Android7.0 PackageManagerService (4) Intent匹配Activity的过程

通过前面的分析,我们知道PKMS负责维护终端全部的Package信息,因此可以想到PKMS具有能力对外提供统一的Package信息查询接口。
我们以查询匹配指定Intent的所有Activity的过程为例,分析一下PKMS提供这类服务对应的流程。

一、PKMS中Activity的信息管理
在前面的博客已经提到,PKMS解析Package信息时,将调用到scanPackageDirtyLI函数。
该函数将会将Package中四大组件等信息,加入到PKMS定义的数据结构中,以便统一管理。

以下代码片段就是为了将Package中的activity相关的信息,加入到PKMS中:

N = pkg.activities.size();
r = null;
for (i=0; i<N; i++) {
   
    PackageParser.Activity a = pkg.activities.get(i);
    a.info.processName = fixProcessName(pkg.applicationInfo.processName,
            a.info.processName, pkg.applicationInfo.uid);
    //Package中的信息被加入到了PKMS的mActivities中
    mActivities.addActivity(a, "activity");
    ..........
}

上述代码的内容比较简单,主要需要关注对应的数据结构。

结合代码,我们知道:
1、PKMS中的成员变量mActivities为ActivityIntentResolver类型,用于保存所有与Activity相关的信息。ActivityIntentResolver内部也有一个mActivities变量,它以ComponentName为key,保存PackageParser.Activity对象。
2、从APK文件中解析出来的所有和Activity相关的信息都由PackageParser.Activity来保存。

我们跟进一下ActivityIntentResolver的addActivity函数:

public final void addActivity(PackageParser.Activity a, String type) {
    //将ComponentName和Activity保存到ActivityIntentResolver的mActivities中
    mActivities.put(a.getComponentName(), a);
    ..........
    final int NI = a.intents.size();
    for (int j=0; j<NI; j++) {
        //ActivityIntentInfo存储的是XML中声明的IntentFilter信息
        PackageParser.ActivityIntentInfo intent = a.intents.get(j);
        if ("activity".equals(type)) {
            final PackageSetting ps =
                    mSettings.getDisabledSystemPkgLPr(intent.activity.info.packageName);
            final List<PackageParser.Activity> systemActivities =
                    ps != null && ps.pkg != null ? ps
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值