SettingsProvider监听值变化(ContentObserver)

1. registerContentObserver注册要监听的变量

public class MainActivity extends Activity {
    public static final String TAG = "Tobserver";

    private Button btnEnable,btnDisable,btnRegister,btnUnregister;
    public ContentResolver mresolver;
    //public SettingsValueChangeContentObserver mObserver;
    int brightness = 100;
    public static final String TEST_URL = "test_main";
    public int ENABLE_TEST_URL = 1;
    public int DISENABLE_TEST_URL = 2;

    private final SettingObserver mObserver = new SettingObserver();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        registerOB();
        btnEnable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG ,"onClick  1");
                registerOB();
            }
        });

        btnDisable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG ,"onClick  2");
                //Settings.System.putInt(mresolver, Settings.System.SCREEN_BRIGHTNESS, brightness);
                putIntValue(brightness);
                brightness ++ ;
            }
        });

        btnUnregister.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG ,"onClick  4");
                unRegisterOB();
            }
        });


    }

    public  void registerOB() {
        getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_POLICY_ACCESS_PACKAGES), false,
                mObserver);
        getContentResolver().registerContentObserver(
                Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS), false,
                mObserver);
        getIntValue();
    }

    public int getIntValue() {
        int newValue = Settings.Secure.getInt(getContentResolver(),
                Settings.Secure.ENABLED_NOTIFICATION_LISTENERS,10);
        Log.d(TAG, " getString = " + newValue);
        return newValue;
    }

    public void putIntValue(int value) {
        Settings.Secure.putInt(getContentResolver(), Settings.Secure.ENABLED_NOTIFICATION_LISTENERS, value);
        Log.d(TAG, " putIntValue " + value);
    }

    public  void unRegisterOB() {
        getContentResolver().unregisterContentObserver(mObserver);
    }

    private final class SettingObserver extends ContentObserver {
        public SettingObserver() {
            super(new Handler(Looper.getMainLooper()));
        }
        @Override
        public void onChange(boolean selfChange, Uri uri) {
            //reloadList();
            Log.d(TAG, "onChange newValue = " + getIntValue());
        }
    }
}

2. 自定义变量监听

把1代码中的,在Settings.Secure定义的变量,直接定义在本地DMS_BUTTON,就可以直接put get值了

public static final String DMS_BUTTON = "dms_button";
public int ENABLE_DMS_BUTTON = 1;
public int DISENABLE_DMS_BUTTON = 2;


public  void registerOB() {
    getContentResolver().registerContentObserver(
            Settings.Secure.getUriFor(DMS_BUTTON), false,
            mObserver);
    getContentResolver().registerContentObserver(
            Settings.Secure.getUriFor(Settings.Secure.ENABLED_NOTIFICATION_LISTENERS), false,
            mObserver);
    getIntValue();

}


public int getIntValue() {
    int newValue = Settings.Secure.getInt(getContentResolver(),
            DMS_BUTTON,10);
    Log.d(TAG, " getString = " + newValue);
    return newValue;
}

public void putIntValue(int value) {

    Settings.Secure.putInt(getContentResolver(), DMS_BUTTON, value);
    Log.d(TAG, " putIntValue " + value);
}
//put和get自己定义的值
* adb shell settings get secure avm_gesture_switch
* adb shell settings put secure avm_gesture_switch 1

3. 原理

ContentProvider、ContentResolver、ContentObserver之间的关系

ContentProvider:
* 四大组件的内容提供者,主要用于对外提供数据
* 实现各个应用程序之间的(跨应用)数据共享,比如联系人应用中就使用了ContentProvider,你在自己的应用中可以读取和修改联系人的数据,不过需要获得相应的权限。其实它也只是一个中间人,真正的数据源是文件或者SQLite等
* 一个应用实现ContentProvider来提供内容给别的应用来操作,通过ContentResolver来操作别的应用数据,当然在自己的应用中也可以

ContentResolver:
* 内容解析者,用于获取内容提供者提供的数据
* ContentResolver.notifyChange(uri)发出消息

ContentObserver:
* 内容监听器,可以监听数据的改变状态
* 目的是观察(捕捉)特定Uri引起的数据库的变化,继而做一些相应的处理,它类似于数据库技术中的触发器(Trigger),当ContentObserver所观察的Uri发生变化时,便会触发它。触发器分为表触发器、行触发器,
相应地ContentObsever也分为表ContentObserver、行ContentObserver,当然这是与它所监听的Uri MIME Type有关的
* ContentResolver.registerContentObserver()监听消息

联系:
简单一句话来描述就是:使用ContentResolver来获取ContentProvider提供的数据,同时注册ContentObserver监听Uri数据的变化

4. Settings.java添加新变量方法


1. Settings或者其他class添加变量

2.Settingsprovider初始化或者不初始化
loadSetting(stmt, Settings.Secure.ALLOW_MOCK_LOCATION,
    "1".equals(SystemProperties.get("ro.allow.mock.location")) ? 1 : 0);

5. SettingsProvider知识点

  • 2.权限问题
    查阅SettingsProvider的设置项不需要声明任何权限。

修改SettingsProvider需要权限:

android.permission.WRITE_SETTINGS,Protection level: signature
Secure数据:android.permission.WRITE_SECURE_SETTINGS,Not for use by third-party applications.
对已Global和Secure模块,还需要关心上文中的isGlobalOrSecureSettingRestrictedForUser()方法设置到的限制
  • 3.数据分类
    SettingsProvider对数据进行了分类,分别是Global、System、Secure三种类型,它们的区别如下:
Global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限;
System:包含各种各样的用户偏好系统设置;
Secure:安全性的用户偏好系统设置,第三方APP有读没有写的权限。
  • 4.命令查询和设置用法
    (主要用于调试和便于bug分析)
#获取亮度是否为自动获取
adb shell settings get system screen_brightness_mode
#设置亮度值
adb shell settings put system screen_brightness 150
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
监听`SettingsProvider`的变化,可以使用`ContentObserver`类。`ContentObserver`是一个观察者模式的类,可以用于监听特定数据源的变化。 首先,需要在你的代码中创建一个`ContentObserver`的子类。在这个子类中,你需要实现`onChange()`方法,以响应`SettingsProvider`的变化。当`SettingsProvider`的数据发生变化时,`onChange()`方法会被触发。 下面是一个监听`SettingsProvider`变化的示例: ```java public class SettingsProviderObserver extends ContentObserver { private Context context; public SettingsProviderObserver(Context context) { super(null); this.context = context; } @Override public void onChange(boolean selfChange) { // 处理SettingsProvider变化 // 可以在这里执行需要的操作 // 示例:获取屏幕亮度设置 int brightness = Settings.System.getInt( context.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, 0 ); Log.d("SettingsProviderObserver", "屏幕亮度变化为:" + brightness); } } ``` 在你需要监听`SettingsProvider`的地方,可以使用以下代码注册`ContentObserver`: ```java // 创建Observer实例 SettingsProviderObserver observer = new SettingsProviderObserver(context); // 注册Observer context.getContentResolver().registerContentObserver( Settings.System.CONTENT_URI, true, observer ); // 当不再需要监听时,可以注销Observer context.getContentResolver().unregisterContentObserver(observer); ``` 这样,当`SettingsProvider`的数据发生变化时,`onChange()`方法会被调用,你可以在这个方法中处理变化数据

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值