一、SettingsProvider
SettingsProvider用来提供设置数据共享,主要用来存放一些Android系统的默认初始值。在Android 6.0版本时,SettingsProvider被重构,Android从性能、安全等方面考虑,把SettingsProvider中原本保存在settings.db中的数据,目前改为全部保存在/data/system/users/0/
下的对应xml文件中。
用一句话概括SettingsProvider的作用,SettingsProvider包含全局性、系统级别的用户编好设置。在手机中有一个Settings应用,用户可以在Settings里面做很多设备的设置,这些用户偏好的设置很多就保存在SettingsProvider中。例如,设置锁屏时间等。
1.1 查看与修改
Settings分为三类,分别存储在不同的xml文件中:
settings_system.xml | 包含各种各样的用户偏好系统设置 |
settings_global.xml | 所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限 |
settings_secure.xml | 安全性的用户偏好系统设置,第三方APP有读没有写的权限 |
使用ADB查看:
adb shell settings list system
adb shell settings list global
adb shell settings list secure
使用ADB获取与修改:
# get方法
adb shell settings get system font_scale
# set方法
adb shell settings put system font_scale 1.6
代码中修改:
Settings.System.putString(getActivity().getContentResolver(), "xxx", "default");
1.2 相关实例
#获取自动锁屏时间
adb shell settings list system | grep timeout
screen_off_timeout=300000
#设置自动锁屏时间
adb shell settings put system screen_off_timeout 2147483647
#全屏沉浸模式(包括状态栏和虚拟按键):
adb shell settings put global policy_control immersive.full=*
#沉浸状态栏:
adb shell settings put global policy_control immersive.status=*
#沉浸虚拟按键(隐藏后底部上划可以呼出):
adb shell settings put global policy_control immersive.navigation=*
#恢复正常模式(如果隐藏了状态栏或者虚拟按键但是又不想用了):
adb shell settings put global policy_control null
1.3 相关源码
状态值进行存储:frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
设置的成员定义:frameworks/base/core/java/android/provider/Settings.java
部分的默认值来源于:frameworks/base/packages/SettingsProvider/res/values/defaults.xml
settings代码位置在:frameworks/base/cmds/settings/settings
1.4 与SystemProperties的区别
数据保存方式不同:SystemProperties的数据保存属性文件中(/system/build.prop等),开机后会被加载到system properties store;SettingsProvider的数据保存在文件/data/system/users/0/settings_***.xml或数据库settings.db中;
作用范围不同:SystemProperties可以实现跨进程、跨层次调用,即底层的c/c++可以调用,java层也可以调用;SettingProvider只能能在java层(APP)使用;
公开程度不同:SettingProvider有部分功能上层第三方APP可以直接使用,SystemProperties是系统私有类,第三方app无法直接访问此类中的方法,但是我们可以通过反射间接访问。