最近在看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" />
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>
<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这个键的值
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(db);
->
loadSettings(sqliteDatabase db)
->
loadSystemSettings(sqliteDatabase db)
->
loadUISoundEffectsSettings(stmt);
验证:
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
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);
...
establishDbTracking(UserHandle.USER_OWNER);
...
}
->
private void establishDbTracking(int userHandle) {
...
dbhelper = new DatabaseHelper(getContext(),userHandle);
...
dbhelper = new DatabaseHelper(getContext(),userHandle);
...
继续深入,SettingsProvider这个类是什么实例化的?
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))
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))
那么问题来了,
1,什么样的APK会放到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) {
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)
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 。发现这个控制使能与否是跟随这个值的。