Settings Provider系统设置数据表中保存系统中偏好设置,应用可通过Settings的API访问对应偏好设置,主要Settings.Global、 Settings.Secure、 Settings.System三种类型的设置。
Settings.Global:全局系统设置,包含始终以相同方式应用于所有已定义用户的偏好设置。 应用程序可以读取这些内容,但不允许写入;与“安全”设置一样,这些设置适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项。常用设置项有蓝牙开关状态、adb开关状态等。
Settings.Secure:安全系统设置,包含应用程序可以读取但不允许写入的系统首选项。 这些首选项适用于用户必须通过系统 UI 或这些值的专用 API 显式修改的首选项,而不是由应用程序直接修改。常用设置项有无障碍、VPN状态等。
Settings.System:系统设置,包含混杂的系统偏好设置。 此表包含简单的名称/值对。 有一些方便的方法可用于访问各个设置条目。常用设置项有铃声、亮度、时间制式等。
下面介绍自定义一个Settings.Global的key的流程,自定义Settings.Secure、 Settings.System的方式类似。
Settings中的修改
源码路径 :
frameworks/base/core/java/android/provider/Settings.java
在Settings
的内部类Global
中增加自定义Key的常量值,可以是String、int、boolean等常用类型。
public static final class Global extends NameValueTable {
/**
* @hide
*/
public static final String CUSTOM_KEY = "your_custom_key";
}
在MOVED_TO_GLOBAL
列表中添加对应自定义Key:
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private static final HashSet<String> MOVED_TO_GLOBAL;
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
private static final HashSet<String> MOVED_TO_SECURE_THEN_GLOBAL;
static {
MOVED_TO_GLOBAL = new HashSet<>();
MOVED_TO_SECURE_THEN_GLOBAL = new HashSet<>();
// these were originally in system but migrated to secure in the past,
// so are duplicated in the Secure.* namespace
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.ADB_ENABLED);
MOVED_TO_SECURE_THEN_GLOBAL.add(Global.BLUETOOTH_ON);
...省略
MOVED_TO_GLOBAL.add(Settings.Global.RADIO_NFC);
MOVED_TO_GLOBAL.add(Settings.Global.RADIO_CELL);
MOVED_TO_GLOBAL.add(Settings.Global.RADIO_WIFI);
MOVED_TO_GLOBAL.add(Settings.Global.RADIO_BLUETOOTH);
MOVED_TO_GLOBAL.add(Settings.Global.RADIO_WIMAX);
MOVED_TO_GLOBAL.add(Settings.Global.SHOW_PROCESSES);
/** 添加你的自定义Keys */
MOVED_TO_GLOBAL.add(Settings.Global.CUSTOM_KEY);
}
再将自定义Key添加到PUBLIC_SETTINGS
的公共系统key列表中:
/**
* @hide
*/
public static final String CUSTOM_KEY = Global.CUSTOM_KEY;
/**
* These are all public system settings
*
* @hide
*/
@UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.R, trackingBug = 170729553)
public static final Set<String> PUBLIC_SETTINGS = new ArraySet<>();
static {
PUBLIC_SETTINGS.add(END_BUTTON_BEHAVIOR);
PUBLIC_SETTINGS.add(WIFI_USE_STATIC_IP);
PUBLIC_SETTINGS.add(WIFI_STATIC_IP);
PUBLIC_SETTINGS.add(WIFI_STATIC_GATEWAY);
PUBLIC_SETTINGS.add(WIFI_STATIC_NETMASK);
...省略
PUBLIC_SETTINGS.add(HAPTIC_FEEDBACK_ENABLED);
PUBLIC_SETTINGS.add(SHOW_WEB_SUGGESTIONS);
PUBLIC_SETTINGS.add(VIBRATE_WHEN_RINGING);
PUBLIC_SETTINGS.add(APPLY_RAMPING_RINGER);
/** 添加你的自定义Keys*/
PUBLIC_SETTINGS.add(CUSTOM_KEY);
}
SettingsProvider中的修改
1.在SettingsProvider
的系统应用模块中添加默认值
。
源码路径:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml
代码如下:
<resources>
<bool name="def_dim_screen">true</bool>
<integer name="def_screen_off_timeout">60000</integer>
<integer name="def_sleep_timeout">-1</integer>
<bool name="def_airplane_mode_on">false</bool>
<bool name="def_theater_mode_on">false</bool>
<!-- Comma-separated list of bluetooth, wifi, and cell. -->
<string name="def_airplane_mode_radios" translatable="false">cell,bluetooth,wifi,nfc,wimax</string>
<string name="airplane_mode_toggleable_radios" translatable="false">bluetooth,wifi,nfc</string>
<string name="def_bluetooth_disabled_profiles" translatable="false">0</string>
<bool name="def_auto_time">true</bool>
<bool name="def_auto_time_zone">true</bool>
<bool name="def_accelerometer_rotation">false</bool>
<!-- Default screen brightness, from 0 to 255. 102 is 40%. -->
<integer name="def_screen_brightness">102</integer>
<bool name="def_screen_brightness_automatic_mode">false</bool>
<fraction name="def_window_animation_scale">100%</fraction>
<fraction name="def_window_transition_scale">100%</fraction>
<bool name="def_haptic_feedback">true</bool>
...省略
<!-- 添加你的自定义Keys -->
<string name="def_custom_key">key1</bool>
2.通过loadGlobalSettings
加载自定义的Keys到SettingsProvider系统应用模块的数据库
中。
源码路径:
frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java
代码如下:
private void loadGlobalSettings(SQLiteDatabase db) {
SQLiteStatement stmt = null;
final Resources res = mContext.getResources();
try {
stmt = db.compileStatement("INSERT OR IGNORE INTO global(name,value)"
+ " VALUES(?,?);");
// --- Previously in 'system'
loadBooleanSetting(stmt, Settings.Global.AIRPLANE_MODE_ON,
R.bool.def_airplane_mode_on);
...省略
loadSetting(stmt, Settings.Global.LID_BEHAVIOR, defaultLidBehavior);
//添加你的自定义Keys
loadStringSetting(stmt, Settings.Global.CUSTOM_KEY, R.string.def_custom_key);
} finally {
if (stmt != null) stmt.close();
}
}
private void loadStringSetting(SQLiteStatement stmt, String key, int resid) {
loadSetting(stmt, key, mContext.getResources().getString(resid));
}
结语
完成以上修改后,即可在任一系统应用中使用自定义的Key:
String value = Settings.Global.getString(getContentResolver(), Settings.Global.CUSTOM_KEY);
Settings.Global.putString(getContentResolver(), Settings.Global.CUSTOM_KEY, " ");
更多请参考另一篇博客中对于SettingsProvider的相关介绍:浅谈android系统应用中的数据共享