您要求查看在startActivity 之后执行的代码,就在这里。
在您的应用中:
Activity.startActivity(Intent) 调用
Activity.startActivity(Intent, Bundle),调用
Activity.startActivityForResult(Intent, int),调用
FragmentActivity.startActivityForResult(Intent, int),调用
Activity.startActivityForResult(Intent, int),调用
Activity.startActivityForResult(Intent, int, Bundle),调用
Instrumentation.execStartActivity(Context, IBinder, IBinder, Activity, Intent, int, Bundle),调用
IActivityManager.startActivity(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle)
最后一行的调用是远程进程调用,这意味着在您的应用进程中,该方法在代理 IActivityManager 实例上调用,该实例将其转发到另一个进程,在本例中为系统进程。
到目前为止,还没有进行 Intent 过滤。
在Android的系统进程中IActivityManager解析为ActivityManagerService并且:
ActivityManagerService.startivity(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle) 调用
ActivityManagerService.startActivityAsUser(IApplicationThread, String, Intent, String, IBinder, String, int, int, ProfilerInfo, Bundle, int),调用
ActivityStackSupervisor.startActivityMayWait(IApplicationThread, int, String, Intent, String, IVoiceInteractionSession, IVoiceInteractor, IBinder, String, int, int, ProfilerInfo, WaitResult, Configuration, Bundle, boolean, int, IActivityContainer, TaskRecord),调用
ActivityStackSupervisor.resolveActivity(Intent, String, int, ProfilerInfo, int),调用
IPackageManager.resolveIntent(Intent, String, int, int)
这是添加 MATCH_DEFAULT_ONLY 的地方,正如 nkalra0123 所说。
另外,这是另一个远程方法调用。 IPackageManager 被解析为 PackageManagerService,然后从那里变成这样:
PackageManagerService.resolveIntent(Intent, String, int, int) 调用
PackageManagerService.queryIntentActivities(Intent, String, int, int),它尝试获取 Intent 包的所有活动。这会从你的包中获取 Activity,然后调用
PackageService.ActivityIntentResolver.queryIntentForPackage(Intent, String, int, ArrayList<PackageParser.Activity>, int),它会获取你的包中的 IntentFilters,然后调用
PackageService.ActivityIntentResolver.queryIntentFromList(Intent, String, boolean , ArrayList<F[]>, int),它调用
IntentResolver.buildResolveList(...),它针对您的 Intent 中的数据运行它找到的所有 IntentFilter,考虑我们是否需要 CATEGORY_DEFAULT,并相应地将匹配的 IntentFilter 添加到列表中。
所有这些调用方法调用然后返回,最终某个对象会发现没有匹配的 IntentFilters。我在这里省略了,因为这是答案的相关部分。