/**********************************************************/
利用ContentProvider监听数据库内容的改变
监听ContentProvider所共享的内容的变化,并随着ContentProvider数据的改变提供相应的处理。
1,创建一个类,继承ContentObserver()
2,注册内容ContentObserver
getContentResolver().registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver contentObserver)
uri:该监听器所监听的ContentProvider的uri
notifyForDescendents:如果该参数设置为true,假如监听器注册监听的Uri为content://abc,那么Uri为content://abc/xyz,content://abc/xyz/foo,的数据改变时也会触发监听器,如果该参数设置为false,假如监听器注册监听的Uri为content://abc,那么只有当content://abc的数据发生改变的时候才会触发该监听器。
contentObserver:监听器实例
package org.crazyit.content;
import android.app.Activity;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
/**
* Description:
* <br/>site: <a href="http://www.crazyit.org">crazyit.org</a>
* <br/>Copyright (C), 2001-2014, Yeeku.H.Lee
* <br/>This program is protected by copyright laws.
* <br/>Program Name:
* <br/>Date:
* @author Yeeku.H.Lee kongyeeku@163.com
* @version 1.0
*/
public class MonitorSms extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 为content://sms的数据改变注册监听器
getContentResolver().registerContentObserver(Uri.parse("content://sms"),true,new SmsObserver(new Handler()));
}
// 提供自定义的ContentObserver监听器类
private final class SmsObserver extends ContentObserver
{
public SmsObserver(Handler handler)
{
super(handler);
}
public void onChange(boolean selfChange)
{
// 查询发送箱中的短信(处于正在发送状态的短信放在发送箱)
Cursor cursor = getContentResolver().query(Uri.parse("content://sms/outbox"), null, null, null, null);
// 遍历查询得到的结果集,即可获取用户正在发送的短信
while (cursor.moveToNext())
{
StringBuilder sb = new StringBuilder();
// 获取短信的发送地址
sb.append("address=").append(cursor.getString(cursor.getColumnIndex("address")));
// 获取短信的标题
sb.append(";subject=").append(cursor.getString(cursor.getColumnIndex("subject")));
// 获取短信的内容
sb.append(";body=").append(cursor.getString(cursor.getColumnIndex("body")));
// 获取短信的发送时间
sb.append(";time=").append(cursor .getLong(cursor.getColumnIndex("date")));
System.out.println("Has Sent SMS::" + sb.toString());
}
}
}
}
使用自己定义的内容提供者的 增删改查 方法可以引起数据的改变,但如果想要触发内容观察者,需要在方法内部,加上getContext().getContentResolver().notifyChange(uri,null)方法
例:如果不知道怎么自定义内容提供者的话,可以翻看我的前一篇博客 Android学习笔记----自定义内容提供者
public class MyContentResolver extends ContentResolver{
...........................
@Override
public Uri insert(Uri uri,ContentValues values){
Uri uriReturn = null;
SQLiteDatabase db = myDbHelper.getWritableDatabase();
switch(uriMarcher.,match()){
case BOOK_DIR:
break;
case BOOK_ITEM:
long newId = db.insert("Book",null,values);
uriReturn = Uri.parse("content://"+AUTHORITY +"/book/"+newId);
<strong><span style="color:#ff6666;"> getContext().getContentResolver().notifyChange(uri,null)</span></strong>
break;
case AUTHORDETAIL_DIR :
break;
case AUTHORDETAIL_ITEM:
long newCateGoryId = db.insert("AuthorDetail",null,values);
uriReturn = Uri.parse("content://"+AUTHORITY+"/category/"+newCateGoryId);
<strong><span style="color:#ff6666;">getContext().getContentResolver().notifyChange(uri,null)</span></strong>
break;
default
break;
}
return uriReturn ;
}
...........................
}
在一个活动的内部自定义内容观察者,然后注册内容观察者,当通过上述自定义的内容提供者的方法引起数据的改变的时候,就会触发注册的内容观察者,可以在注册的内容观察者里面做出对应的处理。