ContentObserver 内容观察者

来源:互联网 发布:淘宝网首页打不开图片 编辑:程序博客网 时间:2024/05/17 00:50


监听某些特定数据的变化继而触发相应的操作,如监听某个表,或表中某一行的数据变化

Android提供了一个东西叫做ContentObserver,内容观察者,类似于数据库的触发器,使用如下:


创建一个ContentObserver的子类

class MyContentObserver extends ContentObserver


在构造方法中调用父类的构造方法

public MyContentObserver(Handler handler){       super(handler);}


重写父类的onChange(boolean selfChange)方法,当所监听的数据变化时,会回调这个方法

public void onChange(boolean selfChange) {...      }


接着需要对我们的ContentObserver进行注册,需要先得到ContentResolver对象

this.getContentResolver().registerContentObserver(Uri uri,boolean notifyForDescendents,ContentObserver observer);

uri:需要观察的uri;

notifyForDescendents: 值为true表示可以同时匹配派生的uri,比如:

Content://com.example.person/student,Content://com.example.person/student/#;

值为false表示精确匹配

取消对数据的监听可用如下语句:

this.getContentResolver().unregisterContentObserver(ContentObserver observer);

下面是一个对短信的监听简单例子:

SmsObserver:

package org.zjl.textcontentobserverimport android.content.ContentResolver;import android.content.ContentValues;import android.content.Context;import android.database.ContentObserver;import android.database.Cursor;import android.net.Uri;import android.os.Handler;public class SmsObserver extends ContentObserver {private Context context;private Handler handler;public SmsObserver(Handler handler,Context context) {super(handler);this.handler = handler;this.context = context;}@Overridepublic void onChange(boolean selfChange) {ContentResolver resolver = ObserverApp.context.getContentResolver();                //查出短信表中最后修改的那条数据                Cursor cursor = resolver.query(Uri.parse("content://sms/"),null, null, null,"date desc");cursor.moveToFirst();if(cursor.getInt(cursor.getColumnIndex("type"))==1){//type==1表示收到的短信,2表示发送的短信System.out.println("收到"+cursor.getString(cursor.getColumnIndex("address"))+"消息");System.out.println(cursor.getString(cursor.getColumnIndex("body")));                        //删除刚刚收到的短信                        resolver.delete(Uri.parse("content://sms/"), "_id=?", new String[]{String.valueOf(cursor.getInt(0))});}else if(cursor.getInt(cursor.getColumnIndex("type"))==2) {System.out.println("发送给"+cursor.getString(cursor.getColumnIndex("address")));System.out.println(cursor.getString(cursor.getColumnIndex("body")));}cursor.close();}}

MainActivity:

package org.zjl.textcontentobserver;import android.app.Activity;import android.net.Uri;import android.os.Bundle;import android.widget.Toast;public class MainActivity extends Activity {SmsObserver smsObserver;Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);smsObserver = new SmsObserver(handler,MainActivity.this);                Uri uri = Uri.parse("content://sms/");//需要被监听的短信数据表urithis.getContentResolver().registerContentObserver(uri, true, smsObserver);}@Overrideprotected void onDestroy() {this.getContentResolver().unregisterContentObserver(smsObserver);super.onDestroy();}}