Content Provider的启动过程

--摘自《Android进阶解密》

第一步: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等代理类

欢迎关注我的微信公众号:安卓圈

posted @ 2018-12-26 15:42  嘉禾世兴  阅读(805)  评论(0编辑  收藏  举报