以数据库发生变化创建一个内容发布者来发布消息,然后在对应的服务中注册一个内容接收者专门用来接收来自这个发布者发布的消息,数据库发生变化观察者观察到这个变化就会做出相应的动作在自定义的内容观察者类中
1. 内容发布者,在数据库的dao操作方法中,执行增加和删除数据的时候就发布消息
发布的消息包含一个特定的字符串,表示这个消息是能够被那个同样规定这个字符串的观察者所观察到
// 内容发布者,数据库发生了改变,通过uri的方向发布了一个改变信息 ContentResolver resolver = context.getContentResolver(); Uri uri = Uri.parse(Constant.RESOLVER_NOTIFY); // 这个RESOLVER_NOTIFY字符串就是一个特定的字符串,用来表示在观察者中要观察到的发布者发布的消息 resolver.notifyChange(uri, null); // 发出消息
2. 内容观察者
包含一个自定义的观察者类,继承自ContentObserver,并通过在onChange方法中来执行接收到消息时要做的动作。在服务的初始化中去注册一个这样的观察者,这样的话就能够观察到数据库的变化了
// 创建一个内容观察者 class AppLockObserver extends ContentObserver{ public AppLockObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { // 收到数据库变化的通知,然后重新加载那个锁定数据库 Log.e("John", "AppLockObserver" + " # " + "数据库发生了变化"); loadLockApp(); super.onChange(selfChange); } }
// 注册一个内容观察者在服务运行的时候 Uri uri = Uri.parse(Constant.RESOLVER_NOTIFY); // 这个uri对应了数据库中发布者发布时的那个uri getContentResolver().registerContentObserver(uri, true, new AppLockObserver(new Handler())); // 注册观察者,这个Handler还不知道怎么用,可能这个handler会在上面按个观察者的构造器中被调用