Android 11 以上 SettingsProvider DatabaseHelper 解析

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Android 11 以上 SettingsProvider DatabaseHelper 解析

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 的 SettingsProviderDatabaseHelper。如果有任何问题或建议,请留言。

相关文章
|
3月前
|
IDE Android开发 iOS开发
深入解析Android与iOS的系统架构及开发环境差异
本文旨在探讨Android和iOS两大主流移动操作系统在系统架构、开发环境和用户体验方面的显著差异。通过对比分析,我们将揭示这两种系统在设计理念、技术实现以及市场策略上的不同路径,帮助开发者更好地理解其特点,从而做出更合适的开发决策。
178 2
|
2月前
|
开发工具 Android开发 iOS开发
深入解析安卓与iOS开发环境的优劣
【10月更文挑战第4天】 本文将深入探讨安卓和iOS两大主流移动操作系统的开发环境,从技术架构、开发工具、用户体验等方面进行详细比较。通过分析各自的优势和不足,帮助开发者更好地理解这两个平台的异同,从而为项目选择最合适的开发平台提供参考。
27 3
|
29天前
|
安全 5G Android开发
安卓与iOS的较量:技术深度解析
【10月更文挑战第24天】 在移动操作系统领域,安卓和iOS无疑是两大巨头。本文将深入探讨这两个系统的技术特点、优势和不足,以及它们在未来可能的发展方向。我们将通过对比分析,帮助读者更好地理解这两个系统的本质和内涵,从而引发对移动操作系统未来发展的深思。
45 0
|
2月前
|
安全 Android开发 iOS开发
深入解析:安卓与iOS的系统架构及其对应用开发的影响
本文旨在探讨安卓与iOS两大主流操作系统的架构差异,并分析这些差异如何影响应用开发的策略和实践。通过对比两者的设计哲学、安全机制、开发环境及性能优化等方面,本文揭示了各自的特点和优势,为开发者在选择平台和制定开发计划时提供参考依据。
58 4
|
2月前
|
测试技术 数据库 Android开发
深入解析Android架构组件——Jetpack的使用与实践
本文旨在探讨谷歌推出的Android架构组件——Jetpack,在现代Android开发中的应用。Jetpack作为一系列库和工具的集合,旨在帮助开发者更轻松地编写出健壮、可维护且性能优异的应用。通过详细解析各个组件如Lifecycle、ViewModel、LiveData等,我们将了解其原理和使用场景,并结合实例展示如何在实际项目中应用这些组件,提升开发效率和应用质量。
48 6
|
3月前
|
存储 开发框架 数据可视化
深入解析Android应用开发中的四大核心组件
本文将探讨Android开发中的四大核心组件——Activity、Service、BroadcastReceiver和ContentProvider。我们将深入了解每个组件的定义、作用、使用方法及它们之间的交互方式,以帮助开发者更好地理解和应用这些组件,提升Android应用开发的能力和效率。
210 5
|
3月前
|
缓存 Android开发 开发者
Android RecycleView 深度解析与面试题梳理
本文详细介绍了Android开发中高效且功能强大的`RecyclerView`,包括其架构概览、工作流程及滑动优化机制,并解析了常见的面试题。通过理解`RecyclerView`的核心组件及其优化技巧,帮助开发者提升应用性能并应对技术面试。
98 8
|
3月前
|
存储 缓存 Android开发
Android RecyclerView 缓存机制深度解析与面试题
本文首发于公众号“AntDream”,详细解析了 `RecyclerView` 的缓存机制,包括多级缓存的原理与流程,并提供了常见面试题及答案。通过本文,你将深入了解 `RecyclerView` 的高性能秘诀,提升列表和网格的开发技能。
75 8
|
2月前
|
安全 网络安全 Android开发
深度解析:利用Universal Links与Android App Links实现无缝网页至应用跳转的安全考量
【10月更文挑战第2天】在移动互联网时代,用户经常需要从网页无缝跳转到移动应用中。这种跳转不仅需要提供流畅的用户体验,还要确保安全性。本文将深入探讨如何利用Universal Links(仅限于iOS)和Android App Links技术实现这一目标,并分析其安全性。
267 0
|
10天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。

推荐镜像

更多