初始化时间
ContentProvider初始化(onCreate)是在Application生命周期方法attachBaseContext之后、onCreate之前
总结一下,我们的应用和ContentProvider初始化过程大致为:
ActivityThread.attath()->
AMS.attachApplication()->
sendMessage(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG)->
ActivityThread.handleBindApplication()->
Application.attachBaseContext()->
ActivityThread.installContentProviders->
ContentProvider.onCreate()->
AMS.publishContentProviders()->
removeMessage(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG)->
Application.onCreate()
为什么要用 ContentProvider?它和 sql 的实现上有什么差别?
ContentProvider 可以实现不同 app 之间共享,但是 sql 只能查询本应用下的数据–支持多线程、多进程
ContentProvider 屏蔽了数据存储的细节,内部实现对用户完全透明,用户只需要关心操作数据的uri 就可以了–存放在contentprovide的数据,以安全的形式进行封装
Sql 也有增删改查的方法,库。而 ContentProvider 还可以去增删改查本地文件. xml 文件的读取等
ContentProvider原理分析
1,知道我们在调用ContentProvider的query后是怎么样处理流程?
2,知道为什么Application为慢于ContentProvider初始化?
3,理解stable和unstable的ContentProvider区别。
https://www.jianshu.com/p/e4803b321f37
原理:我们都知道ContentProvider的onCreate的调用时机介于Application的attachBaseContext和onCreate之间,
Provider的onCreate优先于Application的onCreate执行,并且此时的Application已经创建成功,而Provider里的context正是Application的对象,
Lifecycle这么做,把init的逻辑放到库内部,让调用方完全不需要在Application里去进行初始化了,十分方便
contentProvide启动过程
https://zhuanlan.zhihu.com/p/142910234
和ContentProvider初始化过程大致为:
ActivityThread.attath()->
AMS.attachApplication()->
sendMessage(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG)->
ActivityThread.handleBindApplication()->
Application.attachBaseContext()->
ActivityThread.installContentProviders->
ContentProvider.onCreate()->
AMS.publishContentProviders()->
removeMessage(CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG)->
Application.onCreate()
说说 ContentProvider、ContentResolver、ContentObserver 之间的关系
ContentProvider 内容提供者,用于对外提供数据
ContentResolver.notifyChange(uri)发出消息
ContentResolver 内容解析者,用于获取内容提供者提供的数据
ContentObserver 内容监听器,可以监听数据的改变状态
ContentResolver.registerContentObserver()监听消息