ContentObserver 内容观察者

ContentObserver是Android用于监听特定数据变化的工具,类似于数据库触发器。当监听到数据变化时,它会回调onChange方法。通过创建ContentObserver子类并设置监听URI,可以实现对表或表中某一行数据变化的监控。例如,可以用来监听短信变化。取消监听则调用unregisterContentObserver()方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

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.textcontentobserver

import 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;
	}
	
	@Override
	public 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();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		
		smsObserver = new SmsObserver(handler,MainActivity.this);
                Uri uri = Uri.parse("content://sms/");//需要被监听的短信数据表uri
		this.getContentResolver().registerContentObserver(uri, true, smsObserver);
		
		
	}
	@Override
	protected void onDestroy() {
		this.getContentResolver().unregisterContentObserver(smsObserver);
		super.onDestroy();
	}

}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值