Android system — settings 数据库
0. 前言
Android系统设置数据库用于保存系统的一些默认设置值,另外在开发的时候,有时候我们一些设置属性要保存到本地,防止软件卸载后配置属性消失,也可以将这些值保存到系统数据库中。
1. 关键类及实现
数据库的位置在/data/data/com.android.providers.settings/
保存的是键值对key-value
,数据是保存到系统文件中的
数据库中的默认数据在frameworks/base/packages/SettingsProvider/res/values/defaults.xml
中定义
一般有四种类型(bool, integer, string, fraction)
<bool name="def_sound_effects_enabled">true</bool>
<integer name="def_max_dhcp_retries">9</integer>
<string name="def_location_providers_allowed" translatable="false">gps</string>
<fraction name="def_window_animation_scale">100%</fraction>
通过frameworks\base\packages\SettingsProvider\src\com\android\providers\settings\DatabaseHelper.java
对数据库结构及初始值进行初始化
frameworks\base\core\java\android\provider\settings.java
----------定义变量
2. 实例分析
2.1 无默认值 SET_INSTALL_LOCATION
我们以SET_INSTALL_LOCATION为例,让我们知道这个变量是如何定义使用的:
(1) frameworks\base\core\java\android\provider\settings.java—定义变量:
/**
* Let user pick default install location.
*
* @hide
*/
public static final String SET_INSTALL_LOCATION = "set_install_location";
MOVED_TO_GLOBAL.add(Settings.Global.SET_INSTALL_LOCATION);
(2) frameworks\base\packages\settingsprovider\src\com\android\providers\settings\ databaseHelper.java------给变量赋值
在 loadGlobalSettings(SQLiteDatabase db)方法中:
loadSetting(stmt, Settings.Global.SET_INSTALL_LOCATION, 0);
(3)如何使用:
import android.provider.Settings;
boolean userSetInstLocation = (Settings.Global.getInt(getContentResolver(),
Settings.Global.SET_INSTALL_LOCATION, 0) != 0);
2.2 有默认值 CAR_DOCK_SOUND
我们再以CAR_DOCK_SOUND为例,让我们看看这个变量是如何定义使用的:
(1) frameworks\base\core\java\android\provider\settings.java—定义变量:
public static final String CAR_DOCK_SOUND = "car_dock_sound";
MOVED_TO_GLOBAL.add(Settings.Global.CAR_DOCK_SOUND);
(2) frameworks\base\packages\settingsprovider\src\com\android\providers\settings\ databaseHelper.java------给变量赋值
loadStringSetting(stmt, Settings.Global.CAR_DOCK_SOUND,R.string.def_car_dock_sound);
(3) frameworks\base\packages\settingsprovider\res\values\defaults.xml-----定义初始值
<string name="def_car_dock_sound" translatable="false">/system/media/audio/ui/Dock.ogg</string>
(4)如何使用:
import android.provider.Settings;
String whichSound = null;
whichSound = Settings.Global.CAR_DOCK_SOUND;
ContentResolver cr = mContext.getContentResolver();
final String soundPath = Settings.Global.getString(cr, whichSound);
3. 读写方法
写整型 :Settings.System.putInt(ContentResolver resolver, String name, int value)
//设置系统配置文件中的数据,第一个参数固定的,但是需要上下文,第二个参数是保存的Key,第三个参数是保存的value
boolean changeBluetoothName = Settings.System.putInt(getContentResolver(), "changeBluetoothName", 1);
读整型Settings.System.getInt(ContentResolver resolver, String name,int default_value)
//获取系统配置文件中的数据,第一个参数固定的,但是需要上下文,第二个参数是之前保存的Key,第三个参数表示如果没有这个key的情况的默认值
int blueFlag = Settings.System.getInt(getContentResolver(), "changeBluetoothName", 0);
写字符串 Settings.System.putString(ContentResolver resolver, String name, String value)
读字符串 Settings.System.getString(ContentResolver resolver, String name)
其它类型读写等类似
注意:如果是app项目且非系统权限,项目的AndroidMainfes.xml文件中添加如下权限:
<uses-permission android:name="android.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />