转:android开发笔记之设置(settings)DB数据库

本文详细解析了在Android系统中如何在settings.db数据库中添加、定义及使用自定义变量,包括布尔型、整型、字符串型和分数型四种类型。通过具体示例,如SET_INSTALL_LOCATION和CAR_DOCK_SOUND变量的定义和使用过程,展示了如何在不同应用程序间共享这些变量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

https://blog.youkuaiyun.com/hfreeman2008/article/details/21603577

在设置(settings)应用中,我们可以把一些值(int,boolean,string)保存在db数据库。这个值,我们可以在不同的app应用中使用。我们可以非常方便的在此上添加一些简单的代码,实现一个新的变量在db数据库中,方便不同的app来共同使用。

1.关键类和文件

frameworks\base\packages\settingsprovider\src\com\android\providers\settings\databaseHelper.java-------给变量赋值,我们可以把变量的初始值写到下面的defaults.xml文件中,使用后面的修改和统一管理。

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\core\java\android\provider\settings.java----------定义变量

2.我们以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);

3.我们再以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);


4.在DB数据库中添加一个标志位(HY_VIP_FUNCTION)的样例:

(1)在任意APP中使用样例:

int vipFunction = Settings.System.getInt(getContentResolver(), Settings.System.HY_VIP_FUNCTION, -1);

(2)修改的文件:

frameworks\base\packages\settingsprovider\src\com\android\providers\settings\DatabaseHelper.java

    private void loadSystemSettings(SQLiteDatabase db) {
        SQLiteStatement stmt = null;
        try {
            stmt = db.compileStatement("INSERT OR IGNORE INTO system(name,value)"
                    + " VALUES(?,?);");
 
            loadBooleanSetting(stmt, Settings.System.DIM_SCREEN,
                    R.bool.def_dim_screen);
            loadIntegerSetting(stmt, Settings.System.SCREEN_OFF_TIMEOUT,
                    R.integer.def_screen_off_timeout);
 
            // Set default cdma DTMF type
            loadSetting(stmt, Settings.System.DTMF_TONE_TYPE_WHEN_DIALING, 0);
 
            // Set default hearing aid
            loadSetting(stmt, Settings.System.HEARING_AID, 0);
 
            // Set default tty mode
            loadSetting(stmt, Settings.System.TTY_MODE, 0);
 
            loadIntegerSetting(stmt, Settings.System.SCREEN_BRIGHTNESS,
                    R.integer.def_screen_brightness);
 
            loadBooleanSetting(stmt, Settings.System.SCREEN_BRIGHTNESS_MODE,
                    R.bool.def_screen_brightness_automatic_mode);
 
            loadDefaultAnimationSettings(stmt);
 
            loadBooleanSetting(stmt, Settings.System.ACCELEROMETER_ROTATION,
                    R.bool.def_accelerometer_rotation);
 
            loadDefaultHapticSettings(stmt);
 
            loadBooleanSetting(stmt, Settings.System.NOTIFICATION_LIGHT_PULSE,
                    R.bool.def_notification_pulse);
 
            loadUISoundEffectsSettings(stmt);
 
            loadIntegerSetting(stmt, Settings.System.POINTER_SPEED,
                    R.integer.def_pointer_speed);
            
            
            /** Add by HY [wangxianming] add VIP Function in 2014-02-21 by start @{ */
            loadBooleanSetting(stmt, Settings.System.HY_VIP_FUNCTION,
                    R.bool.hy_def_vip_function_value);
            /** Add by HY [wangxianming] add VIP Function in 2014-02-21 by end @} */

frameworks\base\core\java\android\provider\Settings.java

        /**
         * Name of activity to use for wallpaper on the home screen.
         *
         * @deprecated Use {@link WallpaperManager} instead.
         */
        @Deprecated
        public static final String WALLPAPER_ACTIVITY = "wallpaper_activity";
 
        /**
         * @deprecated Use {@link android.provider.Settings.Global#AUTO_TIME}
         * instead
         */
        @Deprecated
        public static final String AUTO_TIME = Global.AUTO_TIME;
 
        /**
         * @deprecated Use {@link android.provider.Settings.Global#AUTO_TIME_ZONE}
         * instead
         */
        @Deprecated
        public static final String AUTO_TIME_ZONE = Global.AUTO_TIME_ZONE;
 
        /**
         * Display times as 12 or 24 hours
         *   12
         *   24
         */
        public static final String TIME_12_24 = "time_12_24";
 
       
        
      
        
        /** 
         * Add by HY [wangxianming] add VIP Function in 2014-02-21 by start @{
         * 
         * Values 1: is open this function 0: is close this function
         * 
         * @hide
         */ 
        public static final String HY_VIP_FUNCTION = "hy_vip_function"; 
        /** Add by HY [wangxianming] add VIP Function in 2014-02-21 by end @} */


        /**
         * Settings to backup. This is here so that it's in the same place as the settings
         * keys and easy to update.
         *
         * NOTE: Settings are backed up and restored in the order they appear
         *       in this array. If you have one setting depending on another,
         *       make sure that they are ordered appropriately.
         *
         * @hide
         */
        public static final String[] SETTINGS_TO_BACKUP = {
            STAY_ON_WHILE_PLUGGED_IN,   // moved to global
            WIFI_USE_STATIC_IP,
            WIFI_STATIC_IP,
            WIFI_STATIC_GATEWAY,
            WIFI_STATIC_NETMASK,
            WIFI_STATIC_DNS1,
            WIFI_STATIC_DNS2,
            BLUETOOTH_DISCOVERABILITY,
            BLUETOOTH_DISCOVERABILITY_TIMEOUT,
            DIM_SCREEN,
            SCREEN_OFF_TIMEOUT,
            SCREEN_BRIGHTNESS,
            SCREEN_BRIGHTNESS_MODE,
            SCREEN_AUTO_BRIGHTNESS_ADJ,
            VIBRATE_INPUT_DEVICES,
            MODE_RINGER,                // moved to global
            MODE_RINGER_STREAMS_AFFECTED,
            MUTE_STREAMS_AFFECTED,
            VOLUME_VOICE,
            VOLUME_SYSTEM,
            VOLUME_RING,
            VOLUME_MUSIC,
            VOLUME_ALARM,
            VOLUME_NOTIFICATION,
            VOLUME_BLUETOOTH_SCO,
            VOLUME_VOICE + APPEND_FOR_LAST_AUDIBLE,
            VOLUME_SYSTEM + APPEND_FOR_LAST_AUDIBLE,
            VOLUME_RING + APPEND_FOR_LAST_AUDIBLE,
            VOLUME_MUSIC + APPEND_FOR_LAST_AUDIBLE,
            VOLUME_ALARM + APPEND_FOR_LAST_AUDIBLE,
            VOLUME_NOTIFICATION + APPEND_FOR_LAST_AUDIBLE,
            VOLUME_BLUETOOTH_SCO + APPEND_FOR_LAST_AUDIBLE,
            TEXT_AUTO_REPLACE,
            TEXT_AUTO_CAPS,
            TEXT_AUTO_PUNCTUATE,
            TEXT_SHOW_PASSWORD,
            AUTO_TIME,                  // moved to global
            AUTO_TIME_ZONE,             // moved to global
            TIME_12_24,
           
            /**  Add by HY [wangxianming] add VIP Function in 2014-02-21 by start @{ */
            HY_VIP_FUNCTION,
            /**  Add by HY [wangxianming] add VIP Function in 2014-02-21 by end @} */
                          
            DATE_FORMAT,
            HY_WALLPAPER_MODE,
            DTMF_TONE_WHEN_DIALING,
            DTMF_TONE_TYPE_WHEN_DIALING,
            HEARING_AID,
            TTY_MODE,
            SOUND_EFFECTS_ENABLED,
            HAPTIC_FEEDBACK_ENABLED,
            POWER_SOUNDS_ENABLED,       // moved to global
            DOCK_SOUNDS_ENABLED,        // moved to global
            LOCKSCREEN_SOUNDS_ENABLED,
            SHOW_WEB_SUGGESTIONS,
            NOTIFICATION_LIGHT_PULSE,
            SIP_CALL_OPTIONS,
            SIP_RECEIVE_CALLS,
            POINTER_SPEED,
            VIBRATE_WHEN_RINGING
        };


frameworks\base\packages\settingsprovider\res\values\Defaults.xml------http://------------设置初始值

<!-- Development settings -->
    <bool name="def_stay_on_while_plugged_in">false</bool>
 
    <!-- Number of retries for connecting to DHCP.
         Value here is the same as WifiStateMachine.DEFAULT_MAX_DHCP_RETRIES -->
    <integer name="def_max_dhcp_retries">9</integer>
 
    <!-- Default for Settings.Secure.USER_SETUP_COMPLETE -->
    <bool name="def_user_setup_complete">true</bool>
    <integer name="hy_def_wallpaper_mode_value">-1</integer>         
     
     <!-- Add by HY [wangxianming] add VIP Function in 2014-02-21 by start @{ --> 
     <bool name="hy_def_vip_function_value">false</bool>
     <!-- Add by HY [wangxianming] add VIP Function in 2014-02-21 by end @} -->

 5.写在后面的话:

      当年,我看到一位大神在framework下添加此例子时,觉得他们好牛啊,在framework下的settings db数据库中都能添加数据,这要写多少代码啊。今天,正好要解一个bug,当我把framework的代码全部导入到source insight中,看了一下这块的代码,觉得添加一个数据在settings模块的db数据库中这也太简单了。

     “绝知此事要躬行”-----这对于程序员来说,确实是一条精辟的古语啊。

      许多时候,对于未知的恐惧和对困难的过大估计,让我们失去了去做事情的勇气。但是,当我们克服问题去亲手把这件事情做完后,我们会发现,原来事实的真像简单的如此让人发紫啊。

6.参考资料:

(1)http://blog.youkuaiyun.com/xxxsz/article/details/7480354

SystemProperties与Settings.system

### 小米便签二次开发的技术指导 #### 1. 开发前准备 在进行小米便签项目的二次开发之前,需要确保已经熟悉 Android 应用的基础架构以及相关工具链的配置。通常情况下,开发者需要具备以下条件: - 安装并配置好 Android Studio 和 JDK 环境。 - 配置 Git 工具以便于管理源代码版本控制[^1]。 对于小米便签项目而言,其核心功能依赖于通知机制、数据存储(SQLite 或其他数据库)、UI 设计等方面的知识。因此,在开始二次开发之前,建议深入研究这些模块的工作原理及其对应的 API 使用方式。 --- #### 2. 关键技术点解析 ##### (1)通知系统的适配与扩展 由于不同版本的 Android 对通知的支持存在差异,因此在设计兼容性强的通知系统时需要注意以下几点: - **低版本支持** 如果目标设备可能运行较低版本的操作系统,则需考虑 `setLatestEventInfo()` 方法的应用场景。此方法仅适用于 Android 2.3.3 及更早版本中的通知创建逻辑[^2]。 ```java if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { notification.setLatestEventInfo(context, title, message, pendingIntent); } else { // 使用 Notification.Builder 替代 setLatestEventInfo() } ``` - **高版本优化** 在较新的 Android 版本中推荐使用 `NotificationCompat` 类来构建跨平台兼容的通知对象。这种方式可以简化复杂度,并提供更多的自定义选项。 ```java NotificationCompat.Builder builder = new NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_notification) .setContentTitle(title) .setContentText(message) .setPriority(NotificationCompat.PRIORITY_DEFAULT); // 创建通道(针对 Android Oreo及以上) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = context.getString(R.string.channel_name); String description = context.getString(R.string.channel_description); int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance); channel.setDescription(description); NotificationManager notificationManager = context.getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } mNotifiManager.notify(notificationId, builder.build()); ``` --- ##### (2)数据持久化方案的选择 为了增强应用的功能性和用户体验,可以选择适合的数据存储解决方案。常见的做法包括但不限于 SQLite 数据库和 SharedPreferences 文件操作。 - **SQLite 实现笔记保存** 当涉及到大量结构化的数据记录时,采用关系型数据库会更加高效可靠。下面是一个简单的例子展示如何向表中插入新条目: ```sql CREATE TABLE IF NOT EXISTS notes ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` 对应 Java 层面的 CRUD 操作如下所示: ```java public long addNote(String title, String content) { ContentValues values = new ContentValues(); values.put("title", title); values.put("content", content); SQLiteDatabase db = this.getWritableDatabase(); return db.insert("notes", null, values); } ``` - **SharedPreferences 存储偏好设置** 若只是简单地维护一些全局变量或者用户个性化参数,则可以直接利用内置类完成任务。 ```java SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("settings", MODE_PRIVATE); sharedPreferences.edit().putBoolean("isDarkModeEnabled", true).apply(); boolean isDarkModeOn = sharedPreferences.getBoolean("isDarkModeEnabled", false); ``` 以上两种策略可以根据实际需求灵活组合运用[^3]。 --- #### 3. 推荐学习资源与文档指南 虽然官方并未公开特定的小米便签 SDK/API 文档,但是通过阅读现有开源代码能够获取许多宝贵经验。以下是几个值得参考的方向: - GitHub 上类似的记事本应用程序案例; - Google Developers Portal 提供关于现代移动 App 构建的最佳实践教程; - Stack Overflow 社区讨论有关解决常见错误的方法论分享。 此外,还可以关注国内外知名论坛和技术博客上的相关内容更新,保持对行业趋势变化敏感度的同时积累实战技巧。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值