本文接着 “Android ContentProvider进程内通信” ContentProvider讲解进程间通讯
上文中添加配置
1. ContentProvider注册
<provider
android:name=".provider.MyContentProvider"
android:authorities="com.wjn.mycontentprovider"
android:permission="com.wjn.provideraccess"
android:enabled="true"
android:exported="true">
设置ContentProvider的android:permission属性,该属性值可以任意指定一个字符串。通常使用程序的包名作为其中的一部分,这样可以避免和其他应用中的权限声明冲突。例如"com.wjn.provideraccess"。
2.对外声明前面使用的标签,表示这个应用发布了一个叫做com.wjn.provideraccess的权限
<permission
android:name="com.wjn.provideraccess"
android:label="provider pomission"
android:protectionLevel="normal"/>以上也可ContentProvider还可以将访问的权限进一步细化,分成允许读取和允许写入两种。
当ContentProvider设置了读取的权限,那么其他组件想读取到该ContentProvider的内容时,就必须声明使用读的权限。
当ContentProvider设置了写入的权限,那么其他组件想写入该ContentProvider的内容时,就必须声明使用写的权限。
3.要访问上面进程的另外一个进程配置
3.1.声明权限
<uses-permission android:name="com.wjn.provideraccess" />
3.2.代码中使用(此处只测试了插入数据和查询数据,访问另外进程的数据,数据可能为空,所以要做非空判断)
3.2.1.插入数据
// 插入表中数据
ContentValues values = new ContentValues();
values.put("id", 1);
values.put("name", "詹姆斯(插入)");
values.put("describe", "大家好,我是詹姆斯(插入)!");
// 获取ContentResolverContentResolver resolver = getContentResolver();
// 通过ContentResolver 根据URI 向ContentProvider中插入数据if(null!=resolver){
resolver.insert(uri_user,values);
}
3.2.2.查询
// 获取ContentResolver
ContentResolver resolver = getContentResolver();
if(null!=resolver){
// 通过ContentResolver 向ContentProvider中查询数据Cursor cursor = resolver.query(uri_user, new String[]{"id","name","describe"}, null, null, null);
StringBuilder sbBuilder=new StringBuilder();
if(null!=cursor){
while (cursor.moveToNext()){
int id=cursor.getInt(cursor.getColumnIndex("id"));
sbBuilder.append("ID:"+id+"\n");
String name=cursor.getString(cursor.getColumnIndex("name"));
sbBuilder.append("姓名:"+name+"\n");
String describe=cursor.getString(cursor.getColumnIndex("describe"));
sbBuilder.append("描述:"+describe+"\n\n\n");
}Log.d("TAG","sbBuilder.toString()----:"+sbBuilder.toString());
cursor.close();// 关闭游标
}
}
4.结果
4.1.运行前节讲述的demo 插入一条数据 然后查询
4.2.运行新demo 查询上面demo的数据
4.3.在此demo中向上面一个demo插入一条数据后 再次查询
至此 ContentProvider 进程间简单的通讯就完成了!
补充:
ContentProvider的监听