今天得到一个任务: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