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