通过前面的分析,我们知道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