Вы просили увидеть код, выполняемый после 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
, который пересылает его другому процессу, в данном случае системному процессу.
Upк этому моменту фильтрация намерений не выполнялась.
В системном процессе 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.Он получает Деятельности из вашего пакета, а затем вызывает
PackageService.ActivityIntentResolver.queryIntentForPackage(Intent, String, int, ArrayList<PackageParser.Activity>, int)
, который получает IntentFilters в вашем пакете, а затем вызывает
PackageService.ActivityIntentResolver.queryIntentFromList(Intent, String, boolean , ArrayList<F[]>, int)
, который вызывает
IntentResolver.buildResolveList(...)
, который запускает все найденные фильтры IntentFilter для данных в вашем Intent, учитывая, нужен ли нам CATEGORY_DEFAULT
, и добавляя соответствующие IntentFilters в список соответственно.
Все эти вызовывызовы методов затем возвращаются, и в конце концов некоторый объект где-нибудь обнаружит, что не было соответствующих IntentFilters.Я опускаю это здесь, потому что это важная часть ответа.