监听某些特定数据的变化继而触发相应的操作,如监听某个表,或表中某一行的数据变化
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();
}
}