android之旅25 内容提供者与内容观察者
2016-01-07 23:57
573 查看
内容提供者用于提供外部访问自己不对外暴露的数据
清单文件的定义方式
内容提供者实例1:短信获取
系统短信看表sms即可
TelephonyProvider是短信的内容提供者
内容提供者实例2:系统联系人
系统联系人需要关注的表:raw_contacts(contacts_id)、data(每行是一个单独的信息,比如名字、号码、邮箱,都生成一个单独的条目data1,通过raw_contacts_id联系起来,mimetype_id该行信息属于什么类型)、mimetypes(mimetype_id对应的字符串)
清单文件的定义方式
<provider android:name="packageName.PersonProvider" android:authorities="anything.is.possible" --- 内容提供者的地址 android:exported="true"> </provider>
// 自定义内容提供者,访问自定义的数据 public class PersonProvider extends ContentProvider{ private MyOpenHelper oh; private SQLiteDatabase db; //NO_MATCH是下面啥都不匹配的时候返回值,值是-1 //UriMatcher用于提供给外部访问不同的数据内容 UriMatcher um = new UriMatcher(UriMatcher.NO_MATCH); { //传进来 content://anything.is.possible/person 返回1 um.addURI("anything.is.possible","person", 1); //#代表任何数字,也就是匹配content://anything.is.possible/teacher/4 um.addURI("anything.is.possible","teacher/#", 1); } public boolean onCreate(){ oh = new MyOpenHelper(getContext()); db = oh.getWritableDatabase(); return false; } public Uri insert(Uri uri, ContentValues values){ //person是表名,values是其他应用组了以后传进来的 /* uri用于标识内容提供者,就是内容提供者的地址, 等同与在清单文件中部署的android:authorities字段*/ if (um.match(uri)==1){ db.insert("person", null, values); //发送通知给内容观察者 //null表示可以指定一个观察者,类似广播里的最终接收者 ContentResolver cr = getContext().getContentResolver(); cr.notify(uri, null); }else{ throw new IllegalArgumentException("err uri"); } //获取#代表的参数值参数值通过ContentUris.parseId(uri) return uri; } }
//其他人如何使用内容提供者 public void insert(View v){ ContentResolver cr = getContentResolver();//Activity里面有这个方法 ContentValues values = new ContentValues(); values.put("name", "xiaozhi"); values.put("money", "13000");//name、money是person表的项 //会根据uri找到对应的内容提供者,然后调用内容提供者的insert方法 // person就是路径里面带的数据 // content://anything.is.possible是标志 cr.insert( uri.parse("content://anything.is.possible/person"), values); }
内容提供者实例1:短信获取
系统短信看表sms即可
TelephonyProvider是短信的内容提供者
public void click(View v){ ContentResolver cr = getContentResolver(); Cursor curosr = cr.query(uri.parse(content://sms), new String[]{ "address", "date", "body", "type" }, null, null, null); while(cursor.moveToNext()){ String address = cursor.getString(0); long date = cursor.getLong(1); } }
内容提供者实例2:系统联系人
系统联系人需要关注的表:raw_contacts(contacts_id)、data(每行是一个单独的信息,比如名字、号码、邮箱,都生成一个单独的条目data1,通过raw_contacts_id联系起来,mimetype_id该行信息属于什么类型)、mimetypes(mimetype_id对应的字符串)
public void click(View v){ ContentResolver cr = getContentResolver(); Cursor cursor = cr.query(Uri.parse("content://com.android.contacts/raw_contacts"),new String[]{"contact_id"}, null, null, null); while(cursor.moveToNext()){ String contactId = cursor.getString(0); /*mimetype返回的不是data表里面的mimetype_id, cr.query( Uri.parse("content://com.android.contacts/data"), null, "raw_contact_id=?", new String[]{contactId}, null); } }
内容观察者
protected void onCreate(Bundle b){ ContentResolver cr = getContentResolver(); cr.registerContentObserver( Uri.parse("content://sms"), /* true表示以这个开头即可就有通知,比如content://sms/inbox false表示精确匹配,比如这里必须是content://sms */ true, new ContentObserver(new Handler()){ public void onChange(boolean selfChange){ super.onChange(selfChange); //业务逻辑继续..... } }); }
相关文章推荐
- Android必知必会--GreenDao缓存
- 解决Android中单个dex文件中方法数越界的问题
- Android IPC机制之开启多进程模式
- 学习Android用到的资源(ing)
- Android打空的签名包
- Android Studio——handle是发出消息后就自动接收消息的吗?
- android 中style和Theme
- 深入理解Android消息处理系统——Looper、Handler、Thread
- 安卓android.os.Looper.java分析
- Android Tools update proxy
- Android Studio——Message
- Android 键盘遮盖界面布局问题
- Android Studio——private Handler mHandler = new Handler() {...}此处使用的什么语法,继承?重写?匿名类?
- android基础回顾笔记1--四大组件
- android设置圆角矩形
- Android Support library
- Android通过AIDL与远程服务通信
- Android View(一)-View坐标以及方法说明
- Android数据存储---SharedPreferences详解及应用
- Android SQLite学习指南