Intent的查找與匹配簡介

App信息表的構建

在系統啓動時,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對象。

相關文章
相關標籤/搜索