四大组件----ContentProvider 启动过程源码图解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38089373/article/details/81043941

一.简介

ContentProvider 是 Android 提供的用于应用进共享数据的方式,一般来说是单例的,因为多实例会造成进程间通信的开销,并且在实现开发并没有使用的价值。一般的用法有两种,一是使用已有的内容提供器读取和操作相应的应用中的数据,一是创建自己的内容提供器给与程序的数据外部外部访问的接口,主要以表格的形式组织数据,一个内容提供器可以包含多张表。ContenProvider还支持文件数据,但是这些图片视频的结构就不是以表格的结构存在,ContenProvider 的底层原理是通过 Binder 实现的。
1.onCreate: 进行一些初始化的操作,运行在主线程中。
2.query,update,insert,delete: 对应 CRUD 实现对数据的增删改查操作,运行在 Binder 线程池中。这个四个方法可能存在多线程并发访问,因此需要做好线程的同步。如果是 SQLiteDatabase ,并且只有一个的话是避免这个问题,因为 SQLiteDatabase 内部的操作是由进行同步的处理的。
3.getType:返回一个 Uri 请求所对应的 MIME (媒体)类型,同样运行在 Binder 线程中,一个 Uri 对应的 MIME 字符串主要由三个部分组成:

  • 1.以 vnd 开头
  • 2.如果内容 Uri 以路径结尾,后接 android.curcor.dir/,如果内容 uri 以 id 结尾,后接 android.cursor.item/
  • 3vnd..
content://com.example.app.contentprovider/table 对应 vnd.android.cursor.==dir==/vnd.com.example.app.contentprovider.table
content://com.example.app.contentprovider/table/id 对应 vnd.android.cursor.==item==/vnd.com.example.app.contentprovider.table

update, insert, delete 方法会引起数据源的改变,通过 registerContentObserver 注册一个观察者和解除观察者,并且可以通过 ContenResolver 的 notifyChange 方法可以通知外界数据的改变。

二.工作过程

(一)几个对象

1.ContentProviderNative

ContentProvider 的内部类对应的变量名为 Transport ,继承 Binder 并实现了 IContentProvider ,是进程间实现 CRUD 操作的具体的实现类,通过获取这个 对象可实现对 ContentProvider 的操作。

2.ContentResolver/ApplicationContentResolver

ApplicationContentResolver 是 ContentResolver 的继承类类,ContentResolver 和 ContentProvider 并没有直接的关系,只是通过这里去获取到 IContentProvider 对象。

3.ProviderMap

用于缓存 ContentProvider ,可避免多次地进程通信。

4.其他的几个

类似于ActivityThread,ActivityManagerProxy,ActivityManagerThread,ActivityThreadProxy等在Activity 的启动过程 已经有阐述过。

(二).工作过程

1.getContentResolver.query 方法到 AMS 的调用过程
ContentProvider 1.png
2. AMS 与 B 进程中间的调用过成
AMS 中假如 ContentProvider 所在进程未启动,则创建该进程并启动相应的 ContentProvider ,这里可以看到 ContentProvider 的 onCreate 比 Application 的 onCreate 先。
ContentProvider 2.png
3.最后是 A 进程和 B 进程之间的通信
在获取到一个 IContentPovider 对象后,就可以实现对 B 进程的 ContentProvider 进行一定的操作。
ContentProvider 3.png

参考资料
《Android 开发艺术探索》
Content Provider的启动过程
分分钟钟看懂ContentProvider启动源码流程

猜你喜欢

转载自blog.csdn.net/m0_38089373/article/details/81043941
今日推荐