当前位置: 代码迷 >> Android >> Android 系统Settings梗概
  详细解决方案

Android 系统Settings梗概

热度:24   发布时间:2016-04-27 23:40:12.0
Android 系统Settings概要

    今天得到一个任务:Settings的数据是否全部存在SettinsProvider中。因此要研究Settings , 通常有任务找百度,这就是站在巨人的肩膀上开工,大致看了几篇文,做点总结如下(原文地址:http://blog.csdn.net/casun_li/article/details/47257757):

 

    第一,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**() 等方法   (参考:http://blog.csdn.net/wh_19910525/article/details/7770764)

             3. Settings应用界面框架(参考:http://blog.csdn.net/wangjinyu501/article/details/22077803):

                  3.A .  查看AndroidManifest.xml 看到主程序入口为Settings 他的继承关系为Setting-->PreferenceActivity-->ListActivity-->Activity  

      <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>

               3. B  .  相关联的类有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

               4. d.  数据的读取与保存:InputMethodAndLanguageSettings实现了Preference.OnPreferenceChangeListener等接口,在接口实现中可以看到Settings.System.put**()等方法的调用,如 当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将设置存入数据库中。


原文地址:http://blog.csdn.net/casun_li/article/details/47257757

参考文档:

1.  http://blog.csdn.net/wh_19910525/article/details/7770764

2. http://blog.csdn.net/wangjinyu501/article/details/22077803

3. http://www.360doc.com/content/13/0910/01/9171956_313396663.shtml

4. http://blog.csdn.net/caszhao/article/details/5986900

版权声明:本文为博主原创文章,未经博主允许不得转载。

  相关解决方案