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

最近在看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)中

验证:

[email protected]:/data/data/com.android.providers.settings/databases # ls

settings.db

settings.db-journal

[email protected]:/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里面数据库的值“权重”更大,它是二次设置的。但如果新加属性的时候,最好两边统一。

时间: 2024-10-27 19:38:06

Settings中的xml中的值与SettingsProvider中default.xml中的值的区别的相关文章

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea

文章大纲 在xml中声明bean和注入bean 在xml中声明bean和自动注入bean 自动扫描bean和自动注入bean 对自动扫描bean增加约束条件 首次接触spring请参考 Spring 3.0 学习-环境搭建和三种形式访问 1.典型的Spring XML 配置文件表头 <?xml version="1.0" encoding="UTF-8"?><!-- 一般化的Spring XML 配置 --> <beans xmlns=

Eclipse RCP 中创建自定义首选项,并能读取首选项中的值

Eclipse RCP的插件中若想自己定义首选项需要扩展扩展点: org.eclipse.core.runtime.preferences //该扩展点用于初始化首选项中的值 org.eclipse.ui.preferencePages//该扩展点用于定义自己的首选项页面 plugin.xml中内容如: Database Preferences挂在WorkFlowBase下,需要在category中填写workFlowBase的ID WorkFlowPreferenceInitializer类,

[原创]java WEB学习笔记59:Struts2学习之路---OGNL,值栈,读取对象栈中的对象的属性,读取 Context Map 里的对象的属性,调用字段和方法,数组,list,map

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

保存ActionForm中未编辑的字段为NULL,尤其整数不赋0值

Struts中,如果ActionForm里某些字段没有编辑(即没有输入值),提交后直接保存到数据库时,这些字段保存为""(String)或0(int),可是在实际开发中,可能需要将其保存位null,如何实现呢? 最直观的办法:判断字段是否为空,如果为空,则返回null 最简单的办法:修改ActionServlet配置下init-param,具体如下 ActionServlet配置下init-param: 1 <init-param> 2 <param-name>

C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析与解决方法

对于C#中异常:“The type initializer to throw an exception(类型初始值设定项引发异常)”的简单分析,目前本人分析两种情况,如下: 情况一: 借鉴麒麟.NET的类型初始值设定项引发异常文章!!!写的很详细,大家可以看一看! 其实麒麟.NET的这篇文章主要讲解分析了静态成员的方面,总的说就是:类型初始化或访问类型的静态成员时,都会对类中的其他静态成员进行初始化,如果有静态构造函数的话,一并执行静态构造函数.在这过程中所引发的异常我就直接借鉴麒麟.NET的例

异步处理XML异步数据——以原生的JavaScript与jQuery中的$.ajax()为例

此文档解决以下问题: 一.原生的JavaScript从服务器端输出XML格式数据 1.XMLHttpRequest对象的运用 XMLHttpRequest对象的open()方法 XMLHttpRequest对象的send()方法 XMLHttpRequest对象的onreadystatechange事件运用 XMLHttpRequest对象的readyState属性 XMLHttpRequest对象的status属性 XMLHttpRequest对象的responseXML属性 2.docume

输入两个整数,放入到a与b变量中去,如果a&gt;b就将a与b中的值进行交换,否则就不交换。

import java.util.Scanner; /** * @author 蓝色以太 输入两个整数,放入到a与b变量中去,如果a>b就将a与b中的值进行交换,否则就不交换. */ public class Change { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入两个整数:"); int a = sc.nextInt

在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法

在jsp中选中checkbox后 将该记录的多个数据获取,然后传到Action类中进行后台处理 双主键情况下 *.hbm.xml中的写法 ==========方法1: --------1. 选相应的checkbox后  点删除按钮------------- <!-- *******************删除******************* -->     <input type="image" alt="delete"      src=&

如何把一个listview中选中的值展示到另外一个 activity中

我正在创建一个简单的app,有一个功能是从第一个listView中取到选中的值展示到第二个activity中,中间是用了Intent传递,但是现在有个问题时我不知道如何才能在第二个activity中. MainActivity.java [java] view plaincopy package com.devleb.listviewdemo; import android.app.ListActivity; import android.content.Intent; import andro