简介
SettingsProvider由Android系统框架提供,包含全局、系统级别的用户偏好设置,系统中的setting应用和它关系紧密。SettingsProvider作为1个系统apk,随框架1起编译,在目录树中的位置:"frameworks\base\packages\SettingsProvider"。为方便使用,系统对SettingsProvider做了封装处理,封装的代码“frameworks\base\core\java\android\provider\Settings.java”,所以调用Settings中的方法就能轻易访问SettinsProvider。
1.数据分类和存储
存储系统默认属性值,通过监听属性值的变化执行相关的逻辑修改系统属性值,也可用于系统间跨进程通信
SettingsProvider对数据进行了分类,分别是Global、System、Secure,区别:
- Global:全局的偏好设置,对系统中所有用户公开,第3方App无写权限;
手机路径:data/system/users/0/settings_global.xml
- System:用户偏好系统设置;
手机路径:data/system/users/userid/settings_system.xml
- Secure:安全相关的用户偏好系统设置,3方APP有读无写权限。
手机路径:data/system/users/userid/settings_secure.xml
注:在Android多用户环境下,Global分类数据是面向所有用户的,所以settings_global.xml只在0用户下存在
adb pull /data/system/users/0/settings_system.xml
adb pull /data/system/users/0/settings_global.xml
2.保存位置
Settings数据库的数据保存在手机/data/system/users/0目录下,settings_global.xml 、settings_system.xml、settings_secure.xml3个文件中分别是上面说的3种数据。

3.数据读写
/frameworks/base/core/java/android/provider/Settings.java
以 int 类型为例:
写入数据:
Settings.Global.putInt(ContentResolver cr, String name, int value);
读出数据:
Settings.Global.getInt(ContentResolver cr, String name, int def);
该类通过键值对的形式,将1些特定的值以全局的模式保存到Setting的数据库中,可通过它提供的get或put形式的方法对其中的数据进行读写操作
获取Setting里的设置信息:(Setting里面的1些设置也是通过数据库来保存的)
Settings.System.getInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0)//其中"getXXX"代表对应的类似方法,如getInt()、getBoolean、putString()等。
//通过变量名称获取值,若变量不存在,数据库中没有设置过初始值或该值类型不对,将抛出SettingNotFoundException异常
Settings.System.getXXX(ContentResolver cr, String name);
//通过变量名称获取值,若发生上面方法中导致异常的情况,将返给定的默认值
Settings.System.getXXX(ContentResolver cr, String name, XXX def);
//将指定名称的值写入数据库
Settings.System.putXXX(ContentResolver cr,String name, XXX Value);
setting数据库主要使用 SettingsProvider+DatabaseHelper 实现,类似的实现还有 通讯录、通话记录
文件位于:
frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java
frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java
setting 数据库的名称为 settings.db ,里面包含3张表 分别为:system、secure、global
Global:所有的偏好设置对系统的所有用户公开,第3方APP有读没有写的权限;
System:包含各种各样的用户偏好系统设置,第3方APP有读没有写的权限;
Secure:安全性的用户偏好系统设置,第3方APP有读没有写的权限。
其中settings_global.xml 、settings_secure.xml 、settings_system.xml 对应/frameworks/base/core/java/android/provider/Settings.java中的3个内部类:Global、Secure、System。
settings_global.xml 、settings_secure.xml 、settings_system.xml 位于 /data/system/users/0/ 下
这里需再关注1个文件 frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\SettingsProvider.java
在此文件中:定义了各数据库对应的xml文件
private static final String SETTINGS_FILE_GLOBAL = "settings_global.xml";
private static final String SETTINGS_FILE_SYSTEM = "settings_system.xml";
private static final String SETTINGS_FILE_SECURE = "settings_secure.xml";
private static final String SETTINGS_FILE_SSAID = "settings_ssaid.xml";
private static final String SETTINGS_FILE_CONFIG = "settings_config.xml";