内容观察者是观察内容提供者状态变化的,根据内容提供者的不同内容观察者分为了,观察系统的内容提供者和自定义的内容提供者
观察系统的内容提供者
package com.ldw.contentObserve;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注册一个内容观察者,监听短信数据库内容的改变
ContentResolver cr = getContentResolver();
//第一个参数是监听哪一个内容提供者的通知,
//第二个参数是true,只要以content://sms开通的uri数据的改变就能收到通知,模糊匹配
cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
}
class MyObserver extends ContentObserver{
public MyObserver(Handler handler) {
super(handler);
// TODO Auto-generated constructor stub
}
//收到数据改变的通知,此方法被调用
@Override
public void onChange(boolean selfChange){
super.onChange(selfChange);
System.out.println("短信数据库改变了");
}
}
}
观察自定义的内容提供者,首先先定义一个内容提供者,这里以以前的案例为例创建一个内容提供者,在insert语句中添加内容观察者的语句
数据库改变以后,发送一个数据库改变的通知:
//这个方法提供其他的方法调用,用于往po数据库中插入数据
//values由其他的应用传入,封装需要被传入的数据,
@Override
public Uri insert(Uri uri, ContentValues values) {
// TODO Auto-generated method stub
//通过Uri匹配器匹配传入的Uri
if(um.match(uri) == 1){
db.insert("po", null, values);
//发送数据库改变的通知
//第一个参数是:通知发送到哪一个uri上,所有注册这一个uri的内容观察者都可以拿到这个数据库改变的通知
getContext().getContentResolver().notifyChange(uri, null);
}
else if(um.match(uri) == 2){
db.insert("go", null, values);
}
else{
//在匹配器中没有匹配的就抛出异常
throw new IllegalArgumentException("uri不在匹配器重");
}
return uri;
}
创建一个APP来观察内容提供者状态的改变
package com.ldw.selfobvserve;
import android.app.Activity;
import android.content.ContentResolver;
import android.database.ContentObserver;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getContentResolver().registerContentObserver(Uri.parse("content://com.ldw.po"), true,
new ContentObserver(new Handler()){
@Override
public void onChange(boolean selfChange){
super.onChange(selfChange);
System.out.println("自定义的内容提供者的数据库改变了");
}
});
}
}