一.内容观察者ContentObserver
ContentObserver——内容观察者,目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于
数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,
相应地ContentObserver也分为“表“ContentObserver、“行”ContentObserver,当然这是与它所监听的Uri MIME Type有关的。
二.ContentObserver的注册与取消
(1)注册 public final void registerContentObserver(Uri uri, boolean notifyForDescendents, ContentObserver observer);
注册方法有三个参数,第一个参数uri:需要观察的uri,
第二个参数notifyForDescendents:Boolean类型的参数,当为false的时候代表着精确监听,只监听这一条uri的。
当为true的时候代表着可以同时监听其派生的uri。例:
1.gcc://com.http.ok/factory
2.gcc://com.http.ok/factory/children
当为false的时候,当uri gcc://com.http.ok/factory/children发生变化的时候是监听不到的,当为true的时候则可以同时监听到gcc://com.http.ok/factory/children的变化。
第三个参数observer :ContentObserver的派生类实例
(2)取消注册 public final void unregisterContentObserver(ContentObserver observer);
observer :所需要取消的ContentObserver的派生类实例
三.ContentObserver的构造与常用方法
构造方法 public void ContentObserver(Handler handler)
说明:所有 ContentObserver的派生类都需要调用该构造方法
参数:Handler对象。可以是主线程Handler(这时候可以更新UI 了),也可以是任何Handler对象。
常用方法
void onChange(boolean selfChange)
功能:当观察到的Uri发生变化时,回调该方法去处理。所有ContentObserver的派生类都需要重载该方法去处理逻辑。
参数:selfChange 回调后,其值一般为false,该参数意义不大(我也不懂,理解方法最重要)。
四.settings.system
settings.system为系统数据库,里面存放的数据大多为系统的一些配置数据,包括还有一些应用存放的其他数据信息。
用Settings来保存数据简单易用。
通常我是想要查看settings.system的系统数据库,一般会结合上面的ContentObserver一起使用。
从system.setting获得变量数据库的方法就是getUriFor方法, Settings.System.getUriFor(”“);
写入系统数据库的方法:Settings.System.putInt(getContentResolver(),"设置的key值",1);
可以写入多种格式,此方法在Android 6.0 以下是可以直接在清单文件中声明权限使用,但6.0以上权限不论是在清单文件还是动态权限请求都不可以,
必须需要系统级权限,一般高版本会在源码开发时才会使用。
五.结合使用
private ContentObserver mAnalogClockObserver = new ContentObserver(new Handler()) {
@Override
public void onChange(boolean selfChange) {
//当监听的数据库uri发生变动时会触发
......
//也可以将发生变动的值取出,getInt(),getString() ......
Settings.System.getInt(activity.getContentResolver(),"getUriFor()中监听的uri");
}
};
注册:
mContext.getContentResolver().registerContentObserver(Settings.System.getUriFor(Settings.System.NANLOG_CLOCK_STYLE),
false, mAnalogClockObserver);
在app结束或不在需要监听时需要取消注册:
mContext.getContentResolver().unregisterContentObserver(mAnalogClockObserver);