您的位置:首页 > 移动开发 > Android开发

Android 中的内容观察者ContentObserver

2012-02-16 01:04 344 查看
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于

数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。

使用ContentObserver 的时候2个重要方法。

(1)注册: public final void registerContentObserver(Uri
uri, boolean notifyForDescendents, ContentObserver observer)。

功能:为指定的Uri注册一个ContentObserver派生类实例,当给定的Uri发生改变时,回调该实例对象去处理。

(2)卸载: public final void unregisterContentObserver(ContentObserver observer)(2)卸载:

功能:取消对给定Uri的观察

下面是一个监听发信箱的Demo

首先是一个监听类:

package com.bsn.test;

import java.net.URI;
import java.net.URL;

import android.app.Activity;
import android.content.ContentProvider;
import android.content.Context;
import android.database.ContentObserver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;

public class SMSContentObserver extends ContentObserver {
private Context mContext;
private Handler mhandler;
public SMSContentObserver(Context context,Handler handler) {
super(handler);
mContext=context;
mhandler=handler;
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Uri outMMS=Uri.parse("content://sms/sent");
Cursor c=mContext.getContentResolver().query(outMMS, null,null, null, "date desc");
if (c!=null) {
System.out.println("the number is----"+c.getCount());
StringBuilder sb=new StringBuilder();
while (c.moveToNext()) {
sb.append("发件人手机号"+c.getInt(c.getColumnIndex("address")));
sb.append("信息内容"+c.getString(c.getColumnIndex("body")));
}
c.close();
mhandler.obtainMessage(2,sb.toString()).sendToTarget();
}
}
}
(2)注册监听类的acitivity

package com.bsn.test;

import android.app.Activity;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;

public class ObserverActivity extends Activity{
private SMSContentObserver observer;
private TextView numView;
private TextView contentView;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.dotsaygan);
observer=new SMSContentObserver(this, mHandler);
numView=(TextView) findViewById(R.id.tv);
contentView=(TextView) findViewById(R.id.tv1);
registerContentObservers();
}
private void registerContentObservers() {
Uri uri=Uri.parse("content://sms");
getContentResolver().registerContentObserver(uri, true, observer);
}
private Handler mHandler=new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 2:
String outbox=(String)msg.obj;
contentView.setText(outbox);
break;

default:
break;
}
}
};
}
最后别忘记了加入 读取消息的权限

<uses-permission android:name="android.permission.READ_SMS"/>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: