四大组件之一。
ContentProvider是不同应用程序之间进行数据交换的标准API。当一个应用程序暴露自己的数据给其他程序使用时,该应用程序通过提供ContentProvider来实现;其他应用程序通过ContentResolver来操作ContentProvider暴露的数据。
ContentProvider 负责暴露数据,ContentResolver负责操作数据。
1.数据共享标准ContentProvider
简介:
是不同应用程序之间进行数据交换的标准API。ContentProvider以某种Uri的形式对外提供数据,允许其他应用程序访问或修改数据;其他应用程序使用ContentResolver根据Uri去访问操作制定数据。
开发ContentProvider流程:
1.定义自己的ContentProvider类(继承ContentProvider基类)
2.在AndroidManifest.xml中注册ContentProvider,在<application../>元素下添加如下子元素
<provider android:name=".DictProvider"
android:authorities="org.crazyit.providers.dictprovider"
android:exported="true"/>
通过配置文件注册DictProvider(已继承ContentProvider)还需要提供如下几个方法
- boolean onCreate():该方法在ContentProvider创建后会被调用
- Uri insert(Uri uri,ContentValues values):根据Uri插入values对应的数据
- int delete(Uri uri,String selection,String[] selsectionArgs):根据Uri删除selection条件所匹配的所有记录
- int update(Uri uriContentValues values,String selection,String[] selsectionArgs):根据Uri修改selection条件所匹配的全部记录
- Cursor query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):根据Uri查询出selection条件所匹配的全部记录,projection是一个列名列表,表明只选择出指定的数据列
- String getType(Uri uri):返回当前Uri所代表的数据的MIME类型(包括多个记录,MIME类型字符串以vnd.android.cursor.dir/开头;只包含一条记录,MIME类型字符串以vnd.android.cursor.item/开头)
Uri简介:
与URL类似。分为三个部分:
uri例子:content://:org.carzyit.providers.dictprovider/word
- content://:默认协议
- org.carzyit.providers.dictprovider:ContentProvider的authorities.
- word:资源部分(数据部分)
例子:content://:org.carzyit.providers.dictprovider/word/2
此时要访问的是资源为word数据中ID为2的记录
使用ContentResolver操作数据:
Context提供了如下方法获取ContentResolver对象:
- getContentResolver():获取该应用程序默认的ContentResolver对象
- insert(Uri uri,ContentValues values):根据Uri对应的ContentProvider中插入values对应的数据
- delete(Uri uri,String where,String[] selsectionArgs):删除Uri对应的ContentProvider中where条件所匹配的数据
- update(Uri uriContentValues values,String where,String[] selsectionArgs):更新Uri对应的ContentProvider中where条件所匹配的数据
- query(Uri uri,String[] projection,String selection,String[] selectionArgs,String sortOrder):查询Uri对应的ContentProvider中where条件所匹配的数据
一般来说,ContentProvider是单实例模式:多个应用程序通过ContentResolver来操作ContentProvider提供的数据,ContentProvider调用的数据操作会委托给同一个ContentProvider处理。
2.开发ContentProvider
ContentResolver(A应用)——(间接调用CRUD方法)——》》》ContentProvider(B应用)
ContentResolver(A应用)——(向Uri执行CRUD方法)——》》》 Uri ——(委托给该Uri对应的ContentResolver)——》》》ContentProvider(B应用)
开发ContentProvider子类:
1.开发一个ContentProvider子类,需要实现query()\insert()\update()\delete()等方法
2.在AndroidManifest.xml文件中注册该ContentProvider,指定android:authorities属性。
配置ContentProvider:
安卓要求所有应用程序组件(Activity、Service、ContentProvider\BroadcastReceiver)都必须显式进行配置。
在<application../>元素添加<provider.../>子元素来配置ContentProvider
属性:
- name:指定该ContentProvider的实现类的类名
- authorities:指定该ContentProvider对应的Uri
- android:exported:指定该ContentProvider是否允许其他程序调用(设为false,该ContentProvider不允许其他应用调用)
- readPermission:指定读取该ContentProvider所需要的权限
- writePermission:指定写入该ContentProvider所需要的权限
- permisson:相当于同时配置readPermission和writePermission两个权限
使用ContentResolver调用方法:
通过getContentResovler()方法获取ContentResovler对象。
创建ContentProvider:
为了确定该ContentProvider实际能处理的Uri,以及确定每个方法中Uri参数所操作的数据,Android系统提供了UriMatcher工具类。
提供了两个方法。
- void addURI(String authority,String path,int code):该方法用于向UriMatcher对象注册Uri,authority和path组合成一个Uri,code代表该Uri对应的标识码
- int match(Uri uri):根据前面注册的Uri来判断指定Uri对应的标识码(找不到匹配的标识码,返回-1)
ContentUris工具类(操作Uri字符串的工具类)提供如下两个方法。
- withAppendedId(uri,id):用于为路径加上ID部分
- parseId(uri):从指定Uri中解析出所包含的ID值
实例(暂定,后期补充)
3.操作系统的ContentProvider
ContentProvider管理联系人:
实例(暂定,后期补充)
ContentProvider管理多媒体内容:
Uri:后面跟
EXTERNAL_CONTENT_URI:外部存储器
INTERNAL_CONTENT_URI:内部存储器上的
MediaStore.Audio.Media.音频
MediaStore.Images.Media.图片
MediaStore.Video.Media.视频
实例(暂定,后期补充)
4.监听ContentProvider数据改变
ContentObserver简介:
ContentProvider数据发生改变,程序调用如下代码
context.getContentresolver().notifyChange(uri,null);
注册监听器:
registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver obserber)
实例:监听用户发出的短信(暂定,后期补充)