Context Provider啟動過程

  • 2019 年 10 月 7 日
  • 筆記

-諸如此類的四大組件的啟動過程經常在面試中被問到

第一步:query方法到AMS的調用過程

1)ApplicationContentResolver是ContextImpl中的靜態內部類,繼承自ContentResolver,它在ContextImpl的構造方法中被創建,這說明我們調用ContentResolver的insert、query、update等方法時就會啟動Content Provider

2)IContentProvider是ContentProvider在本地的代理,具體的實現為ContentProvider

3)ApplicationContentResolver是ContextImpl的靜態內部類

4)ContentProvider相關的數據存儲在mProviderMap中,起到快取的作用,這樣使用相同的Content Provider時,就不需要每次都要調用AMS的getContentProvider方法了

第二步。AMS啟動Content Provider的過程

1)在attachApplicationLocked方法中調用了thread的bindApplication方法,thread是IApplicationThread類型的,這裡和IActivityManager一樣採用了AIDL,實現bindApplication方法不再是Android 7.0的ApplicationThreadProxy類,而是ApplicationThread類,它是ActivityThread的內部類

另外:

Android 8.0四大組件的啟動過程與Android 7.0主要區別是,與AMS進行進程間通訊時採用的AIDL技術去掉了此前一直沿用的ActivityManagerProxy和ApplicationThreadProxy等代理類

–摘自《Android進階解密》