Android开发之内容观察者

时间:2021-10-25 11:29:46

内容观察者:

当关注应用的数据库数据改变时,内容提供者会发出通知,在内容提供者的uri上注册一个内容观察者,就可以收到数据改变的通知

实现步骤:

1.假如是自定义的ContentProvider,需要在数据发送改变的方法中实现以下代码:

 ContentResolver cr = getContext().getContentResolver();
//发出通知,所有注册在这个uri上的内容观察者都可以收到通知
cr.notifyChange(uri, null);
notifyChange(Uri uri, ContentObserver observer)
//参数uri:内容发送改变的uri
//参数observer:可以为null;假如指定为某个内容观察者,有点类似于广播的最终接收者;假如自己注册该内容观察者,为true
2.在想要接受该数据改变通知的地方,注册一个内容观察者
 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);
initLinstener();
} private void initLinstener() {
ContentResolver cr=getContentResolver();
cr.registerContentObserver(Uri.parse("content://sms"), true, new MyObserver(new Handler()));
} class MyObserver extends ContentObserver{ public MyObserver(Handler handler) {
super(handler);
}
//内容观察者收到数据库发生改变的通知时,会调用此方法
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
System.out.println("短信数据库发送的改变!");
}
} }

registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer)

 //参数uri:监听哪个uri上的内容提供者的通知
 //参数notifyForDescendents:false时,需要精准匹配;true时,需要是以uri开头的uri的数据改变,都能收到通知
 //参数observer:发送改变时回调的对象
需要实现一个MyObserver,实现ContentObserver。并实现该类中的onChange()方法。