ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于 数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器, 相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
熟悉Content Provider(内容提供者)的应该知道,我们可以通过UriMatcher类注册不同类型的Uri,我们可以通过这些不同的 Uri来查询不同的结果。根据Uri返回的结果,Uri Type可以分为:返回多条数据的Uri、返回单条数据的Uri。
总结: 使用ContentObserver的情况主要有一下两者情况:
1、需要频繁检测的数据库或者某个数据是否发生改变,如果使用线程去操作,很不经济而且很耗时 ;
2、在用户不知晓的情况下对数据库做一些事件,比如:悄悄发送信息、拒绝接受短信黑名单等;
注册:
broadcastReplyListener = new BroadcastReplyListener(broadcastReplyHandler); context.getContentResolver().registerContentObserver(BroadcastChat.CONTENT_URI, true, broadcastReplyListener);注意:参数必须是传递主线程所在的handler
实现:
private final class BroadcastReplyListener extends ContentObserver { private Handler handler; public BroadcastReplyListener(Handler handler) { super(handler); this.handler = handler; } @Override public void onChange(boolean selfChange,Uri uri) { String broadcastid = uri.getLastPathSegment(); if(!TextUtils.isEmpty(broadcastid)) { Message msg = handler.obtainMessage(); msg.obj = broadcastid; msg.what = 0; handler.sendMessage(msg); } } }最后:在不用的时候手动注销。