欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

Settings中的xml中的值与SettingsProvider中default.xml中的值的区别,settingsprovider

来源: 开发者 投稿于  被查看 10822 次 评论:215

Settings中的xml中的值与SettingsProvider中default.xml中的值的区别,settingsprovider


最近在看Settings中的一个默认值的时候,发现有两个地方使用,有点疑问。


这两个defaultval有啥区别? ./res/xml/sound_settings.xml:109 104     <CheckBoxPreference
105             android:key="sound_effects"
106             android:title="@string/sound_effects_enable_title"
107             android:defaultValue="true" /> 和 frameworks/base/packages/SettingsProvider/res/values/defaults.xml <bool name="def_sound_effects_enabled">true</bool> -----------------------解答--------------------------- 首先来看代码是如何引用的, 在framework中,资源文件的定义为: frameworks/base/packages/SettingsProvider/res/values/defaults.xml <!-- Default for UI touch sounds enabled -->
<bool name="def_sound_effects_enabled">true</bool> 代码在这里使用 ./base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java:2035:                R.bool.def_sound_effects_enabled); 再看一下逻辑: -》 private void loadUISoundEffectsSettings(SQLiteStatement stmt) { ... loadBooleanSetting(stmt, Settings.System.SOUND_EFFECTS_ENABLED,
                R.bool.def_sound_effects_enabled);//从defaults.xml中读取def_sound_effect_enabled的值,通过SQLite写到数据库SOUDN_EFFECTS_ENABLED这个键的值 ... }
class DatabaeHelper onCreate() ->         // Load inital settings values
        loadSettings(db); ->
loadSettings(SQLiteDatabase db) ->  loadSystemSettings(SQLiteDatabase db) -> loadUISoundEffectsSettings(stmt);
也就是说在Framework下的值是在DataBaseHelper.java这个类的onCreate函数中,使用这值写到数据库(settings.db)中 验证: root@m200:/data/data/com.android.providers.settings/databases # ls
settings.db
settings.db-journal
root@m200:/data/data/com.android.providers.settings/databases # sqlite3 setting.db
sqlite> select * from system; 155|sound_effects_enabled|1
那么,DataBaseHelper这个类什么时候实例化? ./base/packages/SettingsProvider/src/com/android/providers/settings/SettingsProvider.java:381 在SettingsProvider这个类的onCreate方法中 public boolean onCreate() {
...
        establishDbTracking(UserHandle.USER_OWNER); ... } -> private void establishDbTracking(int userHandle) {
...
                dbhelper = new DatabaseHelper(getContext(), userHandle); ...
继续深入,SettingsProvider这个类是什么实例化的? 搜索代码可以发现,SettingsProvider是一个apk 包 frameworks/base/packages/SettingsProvider/Android.mk   1 LOCAL_PATH:= $(call my-dir)
  2 include $(CLEAR_VARS)
  3
  4 LOCAL_MODULE_TAGS := optional
  5
  6 LOCAL_SRC_FILES := $(call all-subdir-java-files)
  7
  8 LOCAL_JAVA_LIBRARIES := telephony-common
  9
10 LOCAL_PACKAGE_NAME := SettingsProvider                                                                                                                    
11 LOCAL_CERTIFICATE := platform
12 LOCAL_PRIVILEGED_MODULE := true
13
14 include $(BUILD_PACKAGE)
15
16 ########################
17 include $(call all-makefiles-under,$(LOCAL_PATH))
这是Android系统的一些APK,这些APK还包括SystemUI.apk,InputDevice.apk等等,这些编译之后都将放在system/priv-app下面; 那么问题来了, 1,什么样的APK会放到pri-app下面? A:在Android.mk里面有LOCAL_PRIVILEGED_MODEULE属性的会放到pri-app下面; 2,/system/app和/system/priv-app/有什么区别? /system/priv-app中包括Launcher,systemui, settingsprovider等,均是系统的核心应用,这些应用能使用系统级的权限,4.4之前的所有/system/app下的软件都能使用系统级的权限。

OK,总结一下, 在Framework下面的值: 在SettingsProvider.apk运行(onCreat)的时候,通过DatabaseHelper这个类读取framework下面default.xml里面的值,然后写到settings.db这个数据库中。
接下来来看Settings是怎么使用这个值? 在 packages/apps/Settings/src/com/android/settings/SoundSettings.java     @Override
    public void onCreate(Bundle savedInstanceState) { ...         mSoundEffects = (CheckBoxPreference) findPreference(KEY_SOUND_EFFECTS);
        mSoundEffects.setPersistent(false);
        mSoundEffects.setChecked(Settings.System.getInt(resolver,
                Settings.System.SOUND_EFFECTS_ENABLED, 1) != 0) ... } 通过SOUND_EFFECTS_ENABLED这个键来读数据库读值,这个键正是settingsProvider写的。 这样看来,跟sound_settings.xml里面的defaultValue没有毛关系啊?! 我作了个实现,在SoundSettungs.java中把对SOUND_EFFECTS_ENABLE这个键操作的地方屏蔽。 设置defaultvalue=true/false 。发现这个控制使能与否是跟随这个值的。 在画UI的时候,先使用soudn_settings.xml里面的defaultValue这个值,当读到数据库的时候,再设置这个值。也就说Framework里面数据库的值“权重”更大,它是二次设置的。但如果新加属性的时候,最好两边统一。

相关频道:

用户评论