以前学习的时候,是通过使用CP(ContentProvider的简称)来访问系统的短信数据库来学习的,工作上很少用到CP,一直以为只有当访问数据库的时候才会用到CP,再加上集成CP以后实现的几个方法都是增删改查方法就很自然的以为它和数据库有关系,这次动手发现使用CPr不一定要使用数据库,两个应用只是通过manifest文件中Provider标准下的authorities标签来进行识别通讯的,底层使用的Binder机制。
所以只要对应好authorities,其他的都不需要,只要在一个应用中通过Uri找到对应的authorities,然后在另一个应用中接收即可。
进程1(Provider提供者)
public class MyProvider extends ContentProvider {
// 以下是ContentProvider的6个方法
//初始化ContentProvider
@Override
public boolean onCreate() {
mContext = getContext();
return true;
}
/**
* 添加数据
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
try {
String pkg = (String) values.get("pkg");
String per = (String) values.get("permission");
Log.e("zh","进程1--pkg:" + pkg + "--permission:" + per);
}catch (Exception e){
e.printStackTrace();
}
// 当该URI的ContentProvider数据发生变化时,通知外界(即访问该ContentProvider数据的访问者)
mContext.getContentResolver().notifyChange(uri, null);
return uri;
}
/**
* 查询数据
*/
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder) {
return null;
}
/**
* 更新数据
*/
@Override
public int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
return 0;
}
/**
* 删除数据
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
return 0;
}
@Override
public String getType(Uri uri) {
return null;
}
}
然后在清单文件中:
<provider
android:exported="true" //可以让外部访问
android:name=".sdk.MyProvider" //Provider的路径
android:authorities="com.mm.yy" //自定义的字段,用来和别的进程相互识别
/>
进程2(Provider访问者)
//按钮点击调用
public void show(View view){
Uri uri_user = Uri.parse("content://com.mm.yy"); //通过自定义的字段找到对应的CP
// 插入表中数据
ContentValues values = new ContentValues();
values.put("pkg", "4");
values.put("permission", "Jordan");
// 获取ContentResolver
ContentResolver resolver = getContentResolver();
// 通过ContentResolver 根据URI 向ContentProvider中插入数据
resolver.insert(uri_user,values);
Log.e("zh","进程2,插入-->pkg:4--permission:Jordan");
}
进程二就完毕了,到这里就能实现最简单的CP通讯,运行两个程序以后,点击按钮,打印如下
所以CP的使用和数据库根本没有什么关系,只不过我们继承ContentProvider类以后要实现六个方法,看起来和数据库有关,如果我们不进行数据的保存是可以不适用数据库的。