概述
最近在写项目,有个关于插拔耳机的监听,看到有个ContentObserver类可以监听数据库
说实话,之前没有使用过这个类,今天使用了一下,还挺好用的,当插入删除数据的时候就会主动回调方法回来,我觉得很方便,而且比广播的发送的要快
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,感觉它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
ContentObserver目前只能是监听通过使用Provider的数据库,直接使用文件的uri是不成功的
事例
下面监听数据库的事例
public class pzSettingContentObserver extends ContentObserver {
private String TAG=this.getClass().getSimpleName();
private Context context;
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public pzSettingContentObserver(Context context,Handler handler) {
super(handler);
this.context = context;
registerContentObservers();
}
//注册观察者
private void registerContentObservers() {
Uri uri=Uri.parse("");
context.getContentResolver().registerContentObserver(PhoneSettings.CONTENT_URI, true,this);
}
@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
Log.i(TAG,"selfChange 1"+selfChange);
}
@Override
public void onChange(boolean selfChange, @Nullable Uri uri) {
super.onChange(selfChange, uri);
Log.i(TAG,"selfChange 2"+uri.toString());
}
@Override
public void onChange(boolean selfChange, @Nullable Uri uri, int flags) {
super.onChange(selfChange, uri, flags);
Log.i(TAG,"selfChange 3"+uri.toString()+",flags="+flags);
}
@Override
public void onChange(boolean selfChange, @NonNull Collection<Uri> uris, int flags) {
super.onChange(selfChange, uris, flags);
for (Uri uri : uris) {
Log.i(TAG,"selfChange 4"+uri.toString()+",flags="+flags);
}
}
}
//解除注册观察者
public void unregisterContentObservers(){
context.getContentResolver().unregisterContentObserver(this);
}
输出的日志如下
2021-06-30 20:14:55.957 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:55.958 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/27
2021-06-30 20:14:55.958 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/27,flags=0
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/28
2021-06-30 20:14:55.985 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/28,flags=0
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/29
2021-06-30 20:14:56.012 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/29,flags=0
2021-06-30 20:14:56.037 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 1false
2021-06-30 20:14:56.038 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 2content://com.android.providers.pzPhoneSetting/SysConfig/30
2021-06-30 20:14:56.038 1280-1280/com.android.pznewphone I/pzSettingContentObserver: selfChange 3content://com.android.providers.pzPhoneSetting/SysConfig/30,flags=0
可以看到当数据发生改变,就会调用到ContentObserver的onChange方法
从onChange方法中可以获取content://操作的是哪个数据库/哪个表/哪行
api
构造函数
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public ContentObserver(Handler handler) {
mHandler = handler;
}
这个api只能观察通过使用contentProvider进行的数据库监听,如果是本地直接打开的数据库,我这尝试是还没有成功监听,要是有能监听到本地直接打开数据库的方法, 欢迎大家留言
![](https://img.haomeiwen.com/i16249515/bbe8b0e3658fae8f.png)
网友评论