App信息表的构建
在系统启动时,PackageManagerService会启动,此时PMS将解析所有已安装的应用的信息,构建一个信息表。
public class PackageManagerService extends IPackageManager.Stub { // 省略代码... // All available activities, for your resolving pleasure. final ActivityIntentResolver mActivities = new ActivityIntentResolver(); // All available receivers, for your resolving pleasure. final ActivityIntentResolver mReceivers = new ActivityIntentResolver(); // All available services, for your resolving pleasure. final ServiceIntentResolver mServices = new ServiceIntentResolver(); // All available providers, for your resolving pleasure. final ProviderIntentResolver mProviders = new ProviderIntentResolver(); // 省略代码... }
匹配过程
当用户通过Intent来跳转某个组件时,会根据Intent中包含的信息到PMS中匹配对应的组件列表,最后跳转到目标组件中。
如果Intent指明了Component,那么直接通过Component就可以找到ActivityInfo列表,这个列表数量只有一个,这个ActivityInfo就是指定的那个组件;
如果没有指定具体的组件,那么Component为空,此时先查看Intent是否指定了要跳转到的目标所在的包名,如果有包名,则会通过包名获取到对应的ActivityInfo;
否则就需要通过ActivityIntentResolver等类的queryIntentForPackage进行模糊匹配,例如Action、Category等。
匹配过程的方法调用流
Context.startActivity()
-> Context.startActivityForResult()
-> Instrumentation.execStartActivity()
-> ActivityManagerService.startActivity()
-> ActivityStackSupervisor.startActivityMayWait()
-> PackageManagerService.resolveIntent()
-> PackageManagerService.queryIntentActivities()
-> 得到ActivityInfo对象。