在 Android 操作系统中,SettingsProvider 是一个非常关键的组件,它负责存储和管理系统和应用的设置。在这篇文章中,我将深入探讨 DatabaseHelper 类,这是 SettingsProvider 的核心部分。
1. DatabaseHelper 是什么?
DatabaseHelper 是一个继承自 SQLiteOpenHelper 的类,它负责创建、更新和管理系统设置数据库。系统设置数据库是一个 SQLite 数据库文件,它存储在 /data/system/users/0/settings_system.xml , /data/system/users/0/settings_secure.xml , /data/system/users/0/settings_global.xml
路径下,其中 user_id
是当前用户的 ID。系统设置数据库包含了多个表,每个表对应一种类型的设置,例如 system, secure, global 等。
2. 主要方法
2.1 onCreate(SQLiteDatabase db)
当数据库第一次创建时,这个方法会被调用。它负责初始化数据库表和默认的系统设置。
@Override public void onCreate(SQLiteDatabase db) { // 创建系统设置表 db.execSQL("CREATE TABLE system (" + "_id INTEGER PRIMARY KEY AUTOINCREMENT," + "name TEXT UNIQUE ON CONFLICT REPLACE," + "value TEXT" + ");"); // ... 其他表的创建代码 ... // 初始化默认设置 loadDefaultSystemSettings(db); }
2.2 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
当数据库版本升级时,这个方法会被调用。它负责更新数据库表结构和数据。
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 根据版本号进行相应的数据库升级操作 if (oldVersion < 2) { // ... 升级到版本2的代码 ... } if (oldVersion < 3) { // ... 升级到版本3的代码 ... } // ... 其他版本的升级代码 ... }
3. 数据表结构
为了更好地理解 DatabaseHelper,需要了解它所管理的数据表结构。以下是一些主要的表:
表名 | 描述 | 主要字段 |
system | 存储系统级别的设置 | _id, name, value |
secure | 存储安全相关的设置 | _id, name, value |
global | 存储全局设置,对所有用户都有效 | _id, name, value |
… | … | … |
4. 初始化默认设置
DatabaseHelper 还负责加载默认的系统设置。这些设置通常定义在 XML 资源文件中,并在数据库创建时加载。
private void loadDefaultSystemSettings(SQLiteDatabase db) { // 从资源文件中加载默认设置 ContentValues values = new ContentValues(); values.put("name", "example_setting_name"); values.put("value", "example_setting_value"); db.insert("system", null, values); // ... 加载其他默认设置 ... }
5. 不同 Android 系统版本 settings 存储的系统位置,区别
Android 系统的 settings 是以 SQLite 数据库的形式存储在系统分区中的。不同的 Android 系统版本,settings 数据库的位置和结构可能会有所不同。以下是一些常见的 Android 系统版本和它们的 settings 数据库位置:
Android 版本 | settings 数据库位置 |
Android 4.4 | /data/data/com.android.providers.settings/databases/settings.db |
Android 5.0 | /data/system/users/0/settings.db |
Android 6.0 | /data/system/users/0/settings_system.db, /data/system/users/0/settings_secure.db, /data/system/users/0/settings_global.db |
Android 7.0 ~ | /data/system/users/0/settings_system.xml, /data/system/users/0/settings_secure.xml, /data/system/users/0/settings_global.xml |
Android 11.0 | /data/system/users/0/settings_system.xml ,/data/system/users/0/settings_secure.xml /data/system/users/0/settings_global.xml |
从上表可以看出,Android 系统从 4.4 到 6.0 版本都是使用 SQLite 数据库来存储 settings 的,但是从不同的目录中读取。从 7.0 版本开始,Android 系统改用 XML 文件来存储 settings,并且将系统级别、安全级别和全局级别的 settings 分开存储在不同的目录中。
6. adb settings 命令的详细使用方法
adb 是 Android Debug Bridge 的缩写,它是一个用于连接和控制 Android 设备的工具。adb 提供了一个名为 settings 的子命令,可以用来查询和修改系统和应用的设置。
adb settings 命令的基本语法如下:
adb shell settings [namespace] [name] [value]
其中:
- namespace 是指要操作的设置所属的命名空间,可以是 system, secure, global 或者其他应用定义的命名空间。
- name 是指要操作的设置的名称。
- value 是指要设置或者查询的值。
例如:
- 查询系统设置中的屏幕亮度:
adb shell settings get system screen_brightness
- 查询全局设置中的飞行模式状态:
adb shell settings get global airplane_mode_on
7. Android 系统如何新建 settings 变量 如何初始化
如果想要在 Android 系统中新建一个自定义的 settings 变量,需要做以下几个步骤:
- 在
SettingsContract
类中定义一个常量,作为自定义变量的名称。例如:
public static final String MY_SETTING = "my_setting";
- 在
DatabaseHelper
类中,在相应的数据表中添加一列,作为自定义变量的存储字段。例如:
db.execSQL("ALTER TABLE system ADD COLUMN my_setting TEXT;");
- 在
DatabaseHelper
类中,在onCreate
方法中,为自定义变量设置一个默认值。例如:
values.put("name", "my_setting"); values.put("value", "default_value"); db.insert("system", null, values);
- 在
SettingsProvider
类中,在call
方法中,为自定义变量添加一个读写的接口。例如:
case MY_SETTING: return getOrPutSetting(uri, db, "system", "my_setting", value);
- 在
Settings
类中,为自定义变量添加一个获取和设置的方法。例如:
public static String getMySetting(ContentResolver cr) { return Settings.System.getString(cr, MY_SETTING); } public static boolean putMySetting(ContentResolver cr, String value) { return Settings.System.putString(cr, MY_SETTING, value); }
就可以在 Android 系统中使用自定义的 settings 变量了
以下是根据提供的 defaults.xml
文件内容制作的表格:
字段名称 | 值范围 | 字段意义 |
def_dim_screen | true, false | 是否降低屏幕亮度 |
def_screen_off_timeout | 整数 (如: 60000) | 屏幕关闭超时时间(毫秒) |
def_sleep_timeout | 整数 (如: -1) | 睡眠超时时间 |
def_airplane_mode_on | true, false | 是否开启飞行模式 |
def_theater_mode_on | true, false | 是否开启剧院模式 |
def_airplane_mode_radios | 字符串 (如: cell,bluetooth,wifi,nfc,wimax) | 飞行模式下关闭的无线通信方式 |
airplane_mode_toggleable_radios | 字符串 (如: bluetooth,wifi,nfc) | 可在飞行模式下切换的无线通信方式 |
def_bluetooth_disabled_profiles | 字符串 (如: 0) | 默认禁用的蓝牙配置 |
def_auto_time | true, false | 是否自动设置时间 |
def_auto_time_zone | true, false | 是否自动设置时区 |
def_accelerometer_rotation | true, false | 是否允许加速度计旋转屏幕 |
def_screen_brightness | 整数 (如: 102) | 默认屏幕亮度 (0-255) |
def_screen_brightness_automatic_mode | true, false | 是否自动调整屏幕亮度 |
def_window_animation_scale | 分数 (如: 100%) | 窗口动画缩放比例 |
def_window_transition_scale | 分数 (如: 100%) | 窗口过渡缩放比例 |
def_haptic_feedback | true, false | 是否开启触觉反馈 |
def_dock_sounds_enabled_when_accessibility | 整数 (如: 0) | 当辅助功能启用时,停靠声音是否启用 |
def_desk_dock_sound | 字符串 (如: /product/media/audio/ui/Dock.ogg) | 桌面停靠声音文件路径 |
def_desk_undock_sound | 字符串 (如: /product/media/audio/ui/Undock.ogg) | 桌面取消停靠声音文件路径 |
def_car_dock_sound | 字符串 (如: /product/media/audio/ui/Dock.ogg) | 汽车停靠声音文件路径 |
def_car_undock_sound | 字符串 (如: /product/media/audio/ui/Undock.ogg) | 汽车取消停靠声音文件路径 |
def_lockscreen_sounds_enabled | 整数 (如: 1) | 锁屏声音是否启用 |
def_lock_sound | 字符串 (如: /product/media/audio/ui/Lock.ogg) | 锁屏声音文件路径 |
def_unlock_sound | 字符串 (如: /product/media/audio/ui/Unlock.ogg) | 解锁声音文件路径 |
def_trusted_sound | 字符串 (如: /product/media/audio/ui/Trusted.ogg) | 受信任的声音文件路径 |
def_wireless_charging_started_sound | 字符串 (如: /product/media/audio/ui/WirelessChargingStarted.ogg) | 无线充电开始声音文件路径 |
def_charging_started_sound | 字符串 (如: /product/media/audio/ui/ChargingStarted.ogg) | 充电开始声音文件路径 |
def_max_sound_trigger_detection_service_ops_per_day | 整数 (如: 1000) | 声音触发检测服务每天的最大操作次数 |
def_sound_trigger_detection_service_op_timeout | 整数 (如: 15000) | 声音触发检测服务的操作超时时间 |
def_lockscreen_disabled | true, false | 是否禁用锁屏 |
def_device_provisioned | true, false | 设备是否已配置 |
def_dock_audio_media_enabled | 整数 (如: 1) | 停靠时是否启用音频媒体 |
def_notifications_use_ring_volume | true, false | 通知是否使用铃声音量 |
def_vibrate_in_silent | true, false | 静音模式下是否震动 |
def_sync_parent_sounds | true, false | 是否同步父音效 |
def_accessibility_speak_password | true, false | 辅助功能是否读出密码 |
def_touch_exploration_enabled | true, false | 是否启用触摸探索功能 |
def_accessibility_display_magnification_scale | 分数 (如: 200%) | 辅助功能显示放大比例 |
def_accessibility_display_magnification_enabled | true, false | 是否启用辅助功能显示放大 |
def_accessibility_display_magnification_auto_update | true, false | 辅助功能显示放大是否自动更新 |
def_user_rotation | 整数 (如: 0) | 用户旋转的默认设置 |
def_download_manager_max_bytes_over_mobile | 整数 (如: -1) | 通过移动数据下载的最大字节数 |
def_download_manager_recommended_max_bytes_over_mobile | 整数 (如: -1) | 通过移动数据下载的推荐最大字节数 |
def_long_press_timeout_millis | 整数 (如: 400) | 长按超时时间(毫秒) |
def_multi_press_timeout_millis | 整数 (如: 300) | 多次按压超时时间(毫秒) |
def_show_ime_with_hard_keyboard | true, false | 是否在硬键盘上显示输入法 |
def_pointer_speed | 整数 (如: 0) | 指针速度的默认设置 |
def_dtmf_tones_enabled | true, false | 是否启用DTMF音调 |
def_sound_effects_enabled | true, false | 是否启用UI触摸声音 |
def_stay_on_while_plugged_in | true, false | 插入时是否保持开机 |
def_max_dhcp_retries | 整数 (如: 9) | 连接到DHCP的最大重试次数 |
def_user_setup_complete | true, false | 用户设置是否完成 |
def_tv_user_setup_complete | true, false | TV用户设置是否完成 |
def_low_battery_sound_timeout | 整数 (如: 0) | 低电量声音超时时间 |
def_immersive_mode_confirmations | 字符串 | 不再需要沉浸模式确认的包列表 |
def_wifi_scan_always_available | 整数 (如: 0) | Wi-Fi扫描是否始终可用 |
def_lock_screen_show_notifications | 整数 (如: 1) | 锁屏上是否显示通知 |
def_lock_screen_allow_private_notifications | true, false | 锁屏上是否允许私有通知 |
def_heads_up_enabled | 整数 (如: 1) | 是否启用Heads Up通知 |
def_device_name | 字符串 (如: %1s s %2ss) | 默认设备名称格式 |
def_device_name_simple | 字符串 (如: %1$s) | 简单的默认设备名称格式 |
def_wake_gesture_enabled | true, false | 是否启用唤醒手势 |
def_double_tap_to_wake | true, false | 是否启用双击唤醒 |
def_nfc_payment_component | 字符串 | NFC支付组件的默认设置 |
def_add_users_from_lockscreen | true, false | 是否允许从锁屏添加用户 |
def_end_button_behavior | 整数 (如: 0x2) | 结束按钮的行为 |
def_restrict_background_data | true, false | 是否限制后台数据 |
def_backup_manager_constants | 字符串 | 备份管理器常量的默认设置 |
def_mobile_data_always_on | true, false | 移动数据是否始终开启 |
def_backup_local_transport_parameters | 字符串 | 本地传输参数的备份默认设置 |
def_zen_duration | 整数 (如: 0) | Zen模式的默认持续时间 |
def_backup_agent_timeout_parameters | 字符串 | 备份代理超时参数的默认设置 |
def_vibrate_when_ringing | true, false | 来电时是否震动 |
def_apply_ramping_ringer | true, false | 是否应用逐渐增强的铃声 |
def_charging_vibration_enabled | true, false | 充电时是否震动 |
def_charging_sounds_enabled | true, false | 充电时是否播放声音 |
def_notification_bubbles | true, false | 是否启用通知气泡 |
def_aware_enabled | true, false | Aware功能是否启用 |
def_skip_gesture | true, false | 是否启用跳过手势 |
def_silence_gesture | true, false | 是否启用静音手势 |
def_aware_lock_enabled | true, false | Aware锁定功能是否启用 |
def_hdmiControlAutoDeviceOff | true, false | HDMI控制自动设备关闭功能是否启用 |
def_screenshot_button_show | 整数 (如: 0) | 是否显示截图按钮的默认设置 |
def_dock_sounds_enabled_when_accessibility | 整数 (如: 0) | 当辅助功能启用时,停靠声音是否启用 |
def_desk_dock_sound | 字符串 (如: /product/media/audio/ui/Dock.ogg) | 桌面停靠声音文件路径 |
def_desk_undock_sound | 字符串 (如: /product/media/audio/ui/Undock.ogg) | 桌面取消停靠声音文件路径 |
def_car_dock_sound | 字符串 (如: /product/media/audio/ui/Dock.ogg) | 汽车停靠声音文件路径 |
def_car_undock_sound | 字符串 (如: /product/media/audio/ui/Undock.ogg) | 汽车取消停靠声音文件路径 |
def_lockscreen_sounds_enabled | 整数 (如: 1) | 锁屏声音是否启用 |
def_lock_sound | 字符串 (如: /product/media/audio/ui/Lock.ogg) | 锁屏声音文件路径 |
def_unlock_sound | 字符串 (如: /product/media/audio/ui/Unlock.ogg) | 解锁声音文件路径 |
def_trusted_sound | 字符串 (如: /product/media/audio/ui/Trusted.ogg) | 受信任的声音文件路径 |
def_wireless_charging_started_sound | 字符串 (如: /product/media/audio/ui/WirelessChargingStarted.ogg) | 无线充电开始声音文件路径 |
def_charging_started_sound | 字符串 (如: /product/media/audio/ui/ChargingStarted.ogg) | 充电开始声音文件路径 |
def_max_sound_trigger_detection_service_ops_per_day | 整数 (如: 1000) | 声音触发检测服务每天的最大操作次数 |
def_sound_trigger_detection_service_op_timeout | 整数 (如: 15000) | 声音触发检测服务的操作超时时间 |
def_lockscreen_disabled | true, false | 是否禁用锁屏 |
def_device_provisioned | true, false | 设备是否已配置 |
def_dock_audio_media_enabled | 整数 (如: 1) | 停靠时是否启用音频媒体 |
def_notifications_use_ring_volume | true, false | 通知是否使用铃声音量 |
def_vibrate_in_silent | true, false | 静音模式下是否震动 |
def_sync_parent_sounds | true, false | 是否同步父音效 |
def_accessibility_speak_password | true, false | 辅助功能是否读出密码 |
def_touch_exploration_enabled | true, false | 是否启用触摸探索功能 |
def_accessibility_display_magnification_scale | 分数 (如: 200%) | 辅助功能显示放大比例 |
def_accessibility_display_magnification_enabled | true, false | 是否启用辅助功能显示放大 |
def_accessibility_display_magnification_auto_update | true, false | 辅助功能显示放大是否自动更新 |
def_user_rotation | 整数 (如: 0) | 用户旋转的默认设置 |
def_download_manager_max_bytes_over_mobile | 整数 (如: -1) | 通过移动数据下载的最大字节数 |
def_download_manager_recommended_max_bytes_over_mobile | 整数 (如: -1) | 通过移动数据下载的推荐最大字节数 |
def_long_press_timeout_millis | 整数 (如: 400) | 长按超时时间(毫秒) |
def_multi_press_timeout_millis | 整数 (如: 300) | 多次按压超时时间(毫秒) |
def_show_ime_with_hard_keyboard | true, false | 是否在硬键盘上显示输入法 |
def_pointer_speed | 整数 (如: 0) | 指针速度的默认设置 |
def_dtmf_tones_enabled | true, false | 是否启用DTMF音调 |
def_sound_effects_enabled | true, false | 是否启用UI触摸声音 |
def_stay_on_while_plugged_in | true, false | 插入时是否保持开机 |
def_max_dhcp_retries | 整数 (如: 9) | 连接到DHCP的最大重试次数 |
def_user_setup_complete | true, false | 用户设置是否完成 |
def_tv_user_setup_complete | true, false | TV用户设置是否完成 |
def_low_battery_sound_timeout | 整数 (如: 0) | 低电量声音超时时间 |
def_immersive_mode_confirmations | 字符串 | 不再需要沉浸模式确认的包列表 |
def_wifi_scan_always_available | 整数 (如: 0) | Wi-Fi扫描是否始终可用 |
def_lock_screen_show_notifications | 整数 (如: 1) | 锁屏上是否显示通知 |
def_lock_screen_allow_private_notifications | true, false | 锁屏上是否允许私有通知 |
def_heads_up_enabled | 整数 (如: 1) | 是否启用Heads Up通知 |
def_device_name | 字符串 (如: %1s s %2ss) | 默认设备名称格式 |
def_device_name_simple | 字符串 (如: %1$s) | 简单的默认设备名称格式 |
def_wake_gesture_enabled | true, false | 是否启用唤醒手势 |
def_double_tap_to_wake | true, false | 是否启用双击唤醒 |
def_nfc_payment_component | 字符串 | NFC支付组件的默认设置 |
def_add_users_from_lockscreen | true, false | 是否允许从锁屏添加用户 |
def_end_button_behavior | 整数 (如: 0x2) | 结束按钮的行为 |
def_restrict_background_data | true, false | 是否限制后台数据 |
def_backup_manager_constants | 字符串 | 备份管理器常量的默认设置 |
def_mobile_data_always_on | true, false | 移动数据是否始终开启 |
def_backup_local_transport_parameters | 字符串 | 本地传输参数的备份默认设置 |
def_zen_duration | 整数 (如: 0) | Zen模式的默认持续时间 |
def_backup_agent_timeout_parameters | 字符串 | 备份代理超时参数的默认设置 |
def_vibrate_when_ringing | true, false | 来电时是否震动 |
def_apply_ramping_ringer | true, false | 是否应用逐渐增强的铃声 |
def_charging_vibration_enabled | true, false | 充电时是否震动 |
def_charging_sounds_enabled | true, false | 充电时是否播放声音 |
def_notification_bubbles | true, false | 是否启用通知气泡 |
def_aware_enabled | true, false | Aware功能是否启用 |
def_skip_gesture | true, false | 是否启用跳过手势 |
def_silence_gesture | true, false | 是否启用静音手势 |
def_aware_lock_enabled | true, false | Aware锁定功能是否启用 |
def_hdmiControlAutoDeviceOff | true, false | HDMI控制自动设备关闭功能是否启用 |
def_screenshot_button_show | 整数 (如: 0) | 是否显示截图按钮的默认设置 |
总结
本文介绍了 Android 11 以上 SettingsProvider DatabaseHelper 的相关知识,包括它的作用、方法、数据表结构、默认设置、不同版本的区别、adb 命令的使用、自定义变量的创建等。
希望本文章能帮助你更好地理解 Android 的 SettingsProvider
和 DatabaseHelper
。如果有任何问题或建议,请留言。