项目中需要读取系统属性,比如行车视频限制开关,大部分情况下系统属性只读,有些业务逻辑比如行车安全限制需要监听系统属性行车视频限制开关状态,可以通过SettingsObserverr监听。
在Android系统当中,系统设置保存着全局性、系统级别的用户编好设置,比如像飞行模式开关、是否开启手机静音模式时震动、屏幕休眠时长等状态值。这些用户偏好的设置很多就保存在SettingsProvider中,在Android 6.0及以后版本,SettingsProvider被重构,Android从性能、安全等方面考虑,把SettingsProvider中原本保存在settings.db中的数据,目前全部保存在XML文件中。并且对SettingsProvider对数据进行了分类,分别是Global、System、Secure三种类型:
获取和写入属性值
settings put global window_animation_scale 10
settings get global window_animation_scale
核心代码
自定义监听SettingObserver
private final class SettingsObserver extends ContentObserver {
/**
* Creates a content observer.
*
* @param handler The handler to run {@link #onChange} on, or null if none.
*/
public SettingsObserver(Handler handler) {
super(handler);
}
@Override
public void onChange(boolean selfChange, Uri uri) {
try {
int switchMode = getSwitchMode();
// 若行车限制开关打开了,则再次校验弹窗逻辑
if (switchMode == Status.On) {
}
} catch (Throwable e) {
e.printStackTrace();
}
}
}
初始化注册监听
// 系统定义属性key
private String limitKey = "属性key";
mSettingsObserver = new SettingsObserver(null);
Uri uri = Settings.Global.getUriFor(limitKey);
if (mSettingsObserver != null) {
getContentResolver().registerContentObserver(uri, true, mSettingsObserver);
}
/**
* 解绑注册
*/
private void unregisterSettingsObserver() {
if (mSettingsObserver != null) {
getContentResolver().unregisterContentObserver(mSettingsObserver);
}
}