【Android】监听系统属性变化SettingsObserver

项目中需要读取系统属性,比如行车视频限制开关,大部分情况下系统属性只读,有些业务逻辑比如行车安全限制需要监听系统属性行车视频限制开关状态,可以通过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);
        }
    }

参考链接

  1. Android 使用ContentObserver监听SettingsProvider值的变化
  2. Android系统 Settings数据库读写操作和数据监听变化原理分析
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值