Settings中的xml中的值与SettingsProvider中default.xml中的值的

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

这两个defaultval有啥区别?

./res/xml/sound_settings.xml:109

104 <CheckBoxPreference105 android:key="sound_effects"106 android:title="@string/sound_effects_enable_title"107android: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 voidloadUISoundEffectsSettings(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 # lssettings.dbsettings.db-journalroot@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 = newDatabaseHelper(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 910 LOCAL_PACKAGE_NAME :=SettingsProvider11 LOCAL_CERTIFICATE := platform12LOCAL_PRIVILEGED_MODULE:= true1314 include $(BUILD_PACKAGE)1516 ########################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) {

可是我知道结果是惨淡的,但还是心存希望!

Settings中的xml中的值与SettingsProvider中default.xml中的值的

相关文章:

你感兴趣的文章:

标签云: