Intent的查找与匹配简介

本文详细介绍了Android系统启动过程中PackageManagerService如何构建应用信息表,并解释了通过Intent匹配目标组件的具体流程,包括直接指定Component和模糊匹配的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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对象。

转载于:https://my.oschina.net/u/3026396/blog/822550

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值