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進階解密》