1)注册ContentObserver方法
public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)
功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。
uri表示需要观察的Uri
notifyForDescendents 为false 表示精确匹配,即只匹配该Uri。 为true 表示可以同时匹配其派生的Uri。
2)取消注册ContentObserver方法
public final void unregisterContentObserver(ContentObserver observer)
功能:取消对给定Uri的观察
参数: observer ContentObserver的派生类实例
2.ContentObserver类介绍
构造方法 ContentObserver(Handler h)
void onChange(boolean selfChange) 功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。
3.观察特定Uri的步骤如下:
1、创建我们特定的ContentObserver派生类,必须重载父类构造方法,必须重载onChange()方法去处理回调后的功能实现
2、利用context.getContentResolover()获ContentResolover对象,接着调用registerContentObserver()方法去注册内容观察者
3、在不需要时,需要手动的调用 unregisterContentObserver()去取消注册。
例子:监听短信内容变化
在Activity中:
public class Day0108_contentobserverActivity extends Activity {
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 100:
String body= (String) msg.obj;
TextView tv= (TextView) findViewById(R.id.tv);
tv.setText(body);
break;
}
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ContentResolver cr= getContentResolver();
ContentObserver smsObserver= new SmsContentObserver(this,handler);
//第二个参数,true表示观察所有有关短信的
cr.registerContentObserver(Uri.parse("content://sms"), true, smsObserver);
//content://sms/inbox//收件箱
//content://sms/sent//已发送
//content://sms/draft//草稿箱
//content://sms/outbox//发件箱
//content://sms/failed//失败短信
//content://sms/queued//代发队列
}
}
//SmsContentObserver代码如下:public class SmsContentObserver extends ContentObserver {
private Handler handler;
private Context context;
public SmsContentObserver(Context context,Handler handler) {
super(handler);
this.handler = handler;
this.context = context;
}
@Override
public void onChange(boolean selfChange) {
ContentResolver cr= context.getContentResolver();
Cursor c= cr.query(Uri.parse("content://sms/inbox"), null, "0", null, "date desc");
StringBuilder sb= new StringBuilder();
while(c.moveToNext()){
//发件人手机号码
String sendNumber= c.getString(
c.getColumnIndex("address"));
//信息内容
String body= c.getString(c.getColumnIndex("body"));
//readType 表示是否已经读 int hasRead = c.getInt(c.getColumnIndex("read"));
if(hasRead == 0){//表示短信未读
System.out.println("短信未读"+sendNumber);
}
sb.append(sendNumber+":"+body+"
");
}
handler.obtainMessage(100,sb.toString()).sendToTarget();
}
}