今天得到一个任务:Settings的数据是否全部存在SettinsProvider中。因此要研究Settings , 通常有任务找百度,这就是站在巨人的肩膀上开工,大致看了几篇文,做点总结如下
第一,Settings 相关的源码目录(我的源码是官方android-4.4_r1版本)。
1. Settings应用 :/android-4.4_r1/packages/apps/Settings (系统设置应用,主要为界面)
2. SettinsProvider:/android-4.4_r1/frameworks/base/packages/SettingsProvider/src/com/android/providers/settings (数据库所在目录:com.android.providers.settings/databases/settings.db 用于保存设置项)
3 . Settings工具:/android-4.4_r1/frameworks/base/core/java/android/provider/Settings ( 提供对SettinsProvider的操作方法--put 和get方法 如: Settings.System.put**()和 Settings.System.get**() 方法 )
4. preference: /android-4.4_r1/frameworks/base/core/java/android/preference/ (主要用到Preferences.java {Settings应用中Fragment结合Preferences一起使用 } 和PreferenceFragment.java {Settings应用中的 Fragment继承于他 })
第二,各博客知识点总结(正确性有待看源码研究)
1. 数据操作: SettinsProvider创建的数据库名字是settings.db 创建了两个表 system, secure ,要往某个表里写东西,可以直接用 Settings.System.put**() Settings.System.get** Settings.secure.put**() Settings.secure.get**()
2. Android系统默认设置 :一种方法是直接修改settings.db的值,就是调用上面说的put**方法 。另一方法是修改/frameworks/base/packages/SettingsProvider/res/values/defaults.xml 和 frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java 我的猜测是DatabaseHelper.java 在创建数据库时将defaults.xml中的配制存入数据库中,以后的都是以数据库为准,以后的操作可以通过Settings.System.put**() 等方法
3. Settings应用界面框架
<activity android:name="Settings"
android:label="@string/settings_label_launcher"
android:taskAffinity="com.android.settings"
android:launchMode="singleTask">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<action android:name="android.settings.SETTINGS" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
相关联的类有header、fragment、preference。每一个header是一个选项条目,像蓝牙、应用等,选择之后右边就会显示对应的fragment(平板),然后fragment和preference联系在一起,组成了一个个设置项.
3.C. 添加设置项:一,res/xml/settings_headers.xml中添自己相要加的项 。 二,创建PreferenceFragment,然后在header里面添加id、fragment、icon、title等
4 . Settings应用设置项结构:InputMethodAndLanguageSettings为例 (参考:http://www.360doc.com/content/13/0910/01/9171956_313396663.shtml)
4. a. 从 res/xml/settings_headers.xml找到InputMethodAndLanguageSettings对应的配置
4. b. 进入InputMethodAndLanguageSettings的onCreate()方法 中找到addPreferencesFromResource(R.xml.language_settings);
4. c. 从布局文件R.xml.language_settings看到布局结构 和相关Preference类,如CheckBoxPreference
,如 当CheckBoxPreference被点击时会回调onPreferenceTreeClick() 从而调用Settings.System.putInt()方法:
@Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, Preference preference) {
..........
if (chkPref == mGameControllerCategory.findPreference("vibrate_input_devices")) {
System.putInt(getContentResolver(), Settings.System.VIBRATE_INPUT_DEVICES,
chkPref.isChecked() ? 1 : 0);
return true;
}
return super.onPreferenceTreeClick(preferenceScreen, preference);
}
第三,总结。终上所述所有的Settings的数据都会写在SettinsProvider的settings.db中,我们可参通过Settings工具操作SettinsProvider将设置存入数据库中。
参考文档:
1. http://www.360doc.com/content/13/0910/01/9171956_313396663.shtml