一、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无法直接访问此类中的方法,但是我们可以通过反射间接访问。