导图社区 ContentProvider思维导图
这是一篇关于ContentProvider的思维导图。该思维导图比较全面地概括总结了关于这一部分的知识点。有利于了解、学习。
编辑于2021-09-03 08:09:57ContentProvider
简介
ContentProvider 用于application 即应用之间共享数据,是不同应用程序之间进行数据交换的标准 API。 应用可通过ContentProvider进行数据暴露,其他应用可通过ContentResolver来访问该应用的数据。 一旦应用通过ContentProvider暴露数据操作接口,则不管该应用是否启动,其他应用都可以通过该接口操作数据。
URI
简介
资源定位符,用于定位某个具体的ContentProvider上的资源。
content://org.crazy.providers.dicprovider/words
content://
这部分是Android的ContentProvider规定的,有点像上网协议的http://
org.crazy.providers.dicprovider
这部分就是,AndriodManifest.xml 文件中,配置ContentProvider的authority属性,系统通过该部分来找到ContentProvider.
words
资源部分,当访问者访问不同资源的时候,这个部分是动态改变的
ContentProvider使用步骤
继承ContentProvider基类,实现方法
boolean onCreate()
ContentProvider唯一一个生命周期方法。 当其他应用通过ContentResolver第一次访问ContentProvider时,onCreate()方法将会被回调。
Uri insert(Uri uri, ContentValues values)
根据Uri插入values对应的数据
int deleted(Uri Uri, String selections, String[] selectionsArgs)
根据Uri删除selection条件所匹配的全部记录
int update(Uri uri, ContentValues values, String selection, String[] selectionArgs, String sortOrder)
根据Uri修改selection条件所匹配的全部记录。
Cursor query(Uri uri, String[] projection, String selection, String[] SelectionArgs, String sortOrder)
根据Uri查询出selection条件所匹配的全部记录,其中projection就是一个列表名,表明只选择出指定的数据列
String getType()
getType()方法,用于返回当前Uri所代表的数据的MIME类型。 如果该Uri对应的数据可能包括多条记录,则MIME类型字符串应该以vnd.andriod.cursor.dir/开头, 如果Uri对应的数据只包含一条记录,则MIME类型字符串应该以vnd.andriod.cursor.iitem/开头。
配置ContentProvider
在AndroidManifest.xml 中注册ContentProvider. 注册如下: <provider andriod:name =".FirstProvider" andriod:authority ="org.crazy.providers.firstprovider" andriod:exported ="true"/>
name
指定该ContentProvider的实现类的类名
authority
指定该ContentProvider对应的Uri, 相当于为ContentProvider分配了一个域名。
andriod:exported
指定该ContentProvider是否运行其他应用调用, 如果该属性设置为FALSE, 则该ContentProvider将不允许其他其他应用调用。
UriMatcher
ContentUris
ContentResolver
ContentProvider与ContentResolver关系
当调用ContentResolver查询数据时,系统会根据方法参数中的Uri,来匹配对应的ContentProvider。 当应用通过ContentResolver 执行CRUD操作,andriod系统根据Uri找到对应的ContentProvider, ContentProvider负责实现CRUD方法完成对底层数据的增删改查操作。 小结:ContentResolver 可以间接调用 ContentProvider的CRUD方法。 ps: 从上面可以发现ContentResolver是一个匹配的过程,它不需要提供方法的具体实现。
获取ContentResolver
通过Context.getContentResolver(), 获取ContentResolver对象
CRUD方法
ContentResolver的方法不需要提供具体实现
insert()
update()
delete()
query()
registerContentObserver()
向指定Uri注册ContentObserver,监听数据改变
多程序使用ContentResolver
一般来说,ContentProvider是单例模式,当多个应用程序通过ContentResolver 来操作ContentProvider提供的数据时候,ContentResolver调用的数据操作将会委托给同一个ContentProvider处理。
ContentObserver数据监听器
有时候,应用程序需要实时监听ContentProvider所共享的数据改变,并随着ContentProvider数据的改变而提供响应,这就需要ContentObserver来监听ContentProvider的数据改变
触发条件
当ContentProvider数据改变时,系统会调用getContext().getContentResolver().notifyChange(uri, Null)方法,来通知所有注册在该Uri上的监听器
ContentObserver使用步骤
向Uri注册ContentObserver监听器
通过调用ContentResolver 的 RegisterContentObserver()方法,向指定Uri注册ContentObserver.
RegisterContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
uri
该监听器所监听的ContentProvider的Uri
notifyForDescendents
代表监听的Uri匹配的规则,即何时触发监听器 如果ContentProvider的uri为 content://abc 该参数为true时,当Uri 为content://abc/xyz, content://abc/fko 的数据改变也会触发监听器 该参数为false时,只有content://abc的数据改变时,才会触发监听器
Observer
监听器实例
实现ContentObserver基类
onChange()
当ContentObserver所监听的ContentProvider数据发生改变时,onChange()方法,将会被回调
操作系统的ContentProvider
ContentProvider管理联系人
ContentProvider管理多媒体内容