当前位置: 代码迷 >> 综合 >> BroadcastReceiver+ContentProvide
  详细解决方案

BroadcastReceiver+ContentProvide

热度:36   发布时间:2024-03-09 07:21:32.0

初始化时间
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()监听消息