ContentProvider是Android的四大组建之一.
基本介绍:
ContentProvider 组建主要用于 Android 系统中不同应用程序间的数据交换. 应用程序 A 通过 ContentProvider 暴露内部的数据, 应用程序 B 通过 ContentResolver 和 A 提供的 Uri 来操作(增, 删 改, 查) A 的数据.
重点内容:
当一个应用程序通过ContentProvider暴露自己的数据操作接口时, 不管该应用程序是否启动, 其他应用程序都可以通过该接口操作应用程序内部的数据.
开发ContentProvider的步骤:
1.定义自己的ContentProvider类,该类需要继承Android提供的ContentProvider基类.
需要实现的接口如下:
public boolean onCreate():该方法在ContentProvider创建后会被调用,当其他应用程序第一次访问ContentProvider,该ContentProvider会被创建出来,并立即回调该onCreate()方法.
public Uri insert(Uri uri, ContentValues values):根据该Uri插入values对应的数据.
public int delete(Uri uri, String selection, String[] selectionArgs):根据Uri删除select条件所匹配的全部数据.
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs):根据Uri修改select条件所匹配的全部记录.
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder):根据Uri查询出select条件所匹配的全部记录,其中projection就是一个列名列表,表明只选择出指定的数据列.
public String getType(Uri uri):该方法用于返回当前Uri所代表的数据的MIME类型.如果该Uri对应数据可能包括多条记录,那么MIME类型字符串应该以vnd.android.cursor.dir/开头;如果该Uri对应的数据只包含一条记录,那么返回MIME类型字符串应该以vnd.android.cursor.item/开头.
2.向Android系统注册这个ContentProvider,也就是在AndroidManifest.xml文件中注册这个ContentProvider,就和注册Activity一样,注册ContentProvider时需要为它绑定一个Uri;
注:向Android中注册ContentProvider,只需在AndroidManifest.xml配置文件中
name属性指定为ContentProvider类,
authorities就相当于为该ContentProvider指定域名,exported设置为true就是允许其他应用访问该应用内部
- ->
"com.example.contentproviderdemo.ContentProviderDemo"
android:name=".ContentProviderDemo"
android:multiprocess="false"
android:exported="true"
>
配置文件解析:
android:exported=”true” //该组件允许被另一个Application启动
android:multiprocess=”false” //该属性通常与android:process=”“一起使用
我们知道默认不指定android:process的话,provider组件所在的进程名就是包名,multiprocess默认为false,则provider会随着应用启动的时候加载。如果对provider指定android:process和android:multiprocess,那么会产生如下几种情况:
内容 | android:process=”:force” | android:process=”” 不定义 |
---|---|---|
android:multiprocess=”false” | provider不会随应用进程的启动而加载,当调用到provider时才会加载, 加载时provider是在”fore”进程中初始化的 | provider会随着应用启动的时候加载,加载时provider是在应用默认主进程中初始化的.对于multiprocess为false(默认值),由系统把定义该ContentProvider的APP启动起来(一个独立的Process)并实例化ContentProvider, 这种ContentProvider只有一个实例, 运行在自己的App的Process中. 所以调用者共享该ContentProvider实例, 调用者与ContentProvider实例位于两个不同的Process中. |
android:multiprocess=”true” | provider不会随应用进程的启动而加载,当调用到provider时才会加载, 加载时provider是在调用者的进程中初始化的 | provider会随着应用启动的时候加载,加载时provider是在应用默认主进程中初始化的.对于multiprocess为true, 意味着provider可以多实例, 那么由调用者在自己的进程空间实例化一个ContentProvider对象, 此时定义ContentProvider的App可能并没有启动. |
URI的解析:
我们先来给出一个简单的URL:http://www.xiyou.edu.cn/test.PHP
分解开来看:
http://:URL的协议部分;只要通过HTTP协议访问网站,这个部分是固定的.
www.xiyou.edu.cn:域名部分.只要访问指定的网站,这个部分总是固定的.
test.php:网站资源部分.当访问者需要访问不同资源时,这个部分根据资源的不同而改变.
ContentProvider要求的Uri与此类似,例如如下Uri:content://com.xiyou.provider.mprovider/test
分解开来看:
content://:此部分是Android的ContentProvider规定的,就想网上的协议默认是http://一样.暴露ContentProvider,访问ContentProvider的协议默认是content://.
com.xiyou.provider.mprovider:这个部分是就是ContentProvider的authority.系统就是由这个部分来找到操作哪个ContentProvider只要访问指定的ContentProvider,这个部分总是固定的.
test:资源部分,当访问者需要访问不同的资源时,这个部分是动态改变的 .
综上: ContentProvider开发时需要注意的点都在此了, 具体的demo后续会提交到github上.
参考
Android四大组件之ConentProvider.
Android ContentProvider 多进程multiprocess 详解