在系統啓動時,PackageManagerService會啓動,此時PMS將解析全部已安裝的應用的信息,構建一個信息表。java
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中匹配對應的組件列表,最後跳轉到目標組件中。ide
若是Intent指明瞭Component,那麼直接經過Component就能夠找到ActivityInfo列表,這個列表數量只有一個,這個ActivityInfo就是指定的那個組件;spa
若是沒有指定具體的組件,那麼Component爲空,此時先查看Intent是否指定了要跳轉到的目標所在的包名,若是有包名,則會經過包名獲取到對應的ActivityInfo;code
不然就須要經過ActivityIntentResolver等類的queryIntentForPackage進行模糊匹配,例如Action、Category等。對象
Context.startActivity() it
-> Context.startActivityForResult()io
-> Instrumentation.execStartActivity()class
-> ActivityManagerService.startActivity()service
-> ActivityStackSupervisor.startActivityMayWait()方法
-> PackageManagerService.resolveIntent()
-> PackageManagerService.queryIntentActivities()
-> 獲得ActivityInfo對象。