Android Settings模块分析

Settings模块

第一部分 Settings涉及的模块

	4.0设置的layout有很大的改变。将设置分为四个部分:
	WIRELESS & NETWORKS   :SIM卡管理,流量使用情况,飞行模式,VPN,网络共享等
	DEVICE :   情景模式,显示,存储,电池,应用程序
	PERSONAL:  账户与同步,位置服务,安全,语言和输入法,备份和重置
	SYSTEM:    日期和时间,定时开关及,辅助功能,开发人员选项,关于手机


第二部分 Fragment


2.1 com.android.settings.Settings类
       设置页面的Activity:
      public class Settings extends PreferenceActivity implements ButtonBarHandler{}。因为从3.0中就引入了Fragment机制,所以在Settings里面就只有这一个(待确定)Acitivity类,而进入里表中的某项设置后,不是进入到新的Activity,而是在原来的Activity上切换了一个UI界面而已。


2.2 Settings模块的Fragment 
		4.0上Settings使用了Framgment机制。Fragment是我们在单个Activity上要切换多 个UI界面,显示不同内容,对不同的界面不再使用不同的Activity。模块化这些UI面板以便提供给其他Acitivity使用便利。同时我们显示的Fragment也会受到当前的这个 Acitivity生命周期影响。(而平常的Fragment有其自己的生命周期)。
		因为使用了Fragment机制,所有Settings的主要的Layout文件和2.3已经有很大不同。在res/xml/settings_headers.xml中可以找到settings中包含的选项,可以比较一下两者的不同:在2.3中layout文件为:(res/xml/settings.xml)
    
       
       
         
		...(以下略)
而在4.0中的layout文件为:

    
    
         
两者的很大的不同就是在4.0中用了Fragment机制后,每个列表相应后不是重新启动一个Activity,而是在原来的Activity(Settings)上切换了一个UI界面,在
中通过以下方法指定每个模块设置相关的类: android:fragment="com.android.settings.****.****" 这些类都是继承自Fragment类。相关的模块设置的入口类如下: SIM卡设置: com.android.settings.gemini.SimManagement wifi设置: com.android.settings.wifi.WifiSettings 蓝牙设置: com.android.settings.bluetooth.BluetoothSettings 流量: com.android.settings.DataUsageSummary 更多(wireless): com.android.settings.WirelessSettings 情景模式: com.android.settings.audioprofile.AudioProfileSettings 显示: com.android.settings.DisplaySettings 存储: com.android.settings.deviceinfo.Memory 电池: com.android.settings.fuelgauge.PowerUsageSummary 应用程序: com.android.settings.applications.ManageApplications 账户与同步: com.android.settings.accounts.ManageAccountsSettings 位置: com.android.settings.LocationSettings 安全: com.android.settings.SecuritySettings 输入法与语言: com.android.settings.inputmethod.InputMethodAndLanguageSettings 日期时间设置: com.android.settings.DateTimeSettings 定时开关机: com.android.settings.schpwronoff.AlarmClock 开发人员选项: com.android.settings.DevelopmentSettings 关于手机: com.android.settings.DeviceInfoSettings (关于Fragment的相关待补充) 第三部分 获取与设置系统属性 在android中,许多的系统属性都在settings应用当中进行设置的,如wifi,蓝牙状态,本机语言,屏幕亮度等一些相关的系统属性值。这些数据存储在数据库中,对应的两个主要的URI:content://settings/system和 content://settings/secure。 在settings应用中所获取或者修改属性都是调用了framework中的android.provider.settings中的Settings类对应的方法。在android.provider.settings.Settings里面,包含了System和Secure几个内部类,每个内部类对应了一张数据库表,也就是继承自BaseColumn类。System和Secure类分别对应着system和secure数据库表。里面包含了获取设置值的方法以及相关设置项的URI字串。 常见的获取和设置系统属性的方法有: getString(param1,param2) <---> putString(param1,param2) getInt(param1,param2)    <--->  putInt(param1,param2) getLong(param1,param2)   <--->  putLong(param1,param2) getConfiguration(param1,param2)  <--->   putConfiguration(param1,param2) getFloat(param1,param2)   <--->  putFloat(param1,param2) ... Example:settings应用中是如何对系统属性进行设置的。   当需要获得当前wifi状态的值,调用已封装的方法如下:   Settings.Secure.getInt(getContentResolver() , Settings.Secure.WIFI_ON);   修改wifi状态只需要调用对应的setInt方法就可以实现。   当需要获得当前时间日期自动获取,调用如下:   Settings.System.getInt(getContentResolver() , "auto_time");   修改也是调用对应的setInt方法。 第四部分 language settings示例分析     我们通过分析 language settings中的 auto_caps(自动替换)设置来分析Settings中是怎么对系统属性进行基本设置的. 4.1 找到对应的JAVA类文件 InputMethodAndLanguageSettings    在 res./xml/settings_headers.xml中有: < !-- Language -->
根据fragment的定义我们找到: 4.2 找到 R.xml.language_settings布局文件      在 InputMethodAndLanguageSettings.java中,我们找到: ... public void onCreate(Bundle icicle) {         super.onCreate(icicle);        addPreferencesFromResource(R.xml.language_settings); … } … 可以找到language_settings.xml文件.同样可以看到这里利用了Fragment机制。 在代码中我们找到自动替换的设置选项分析:         对应的手机中的UI界面为: 4.3  获取和设置属性 在 com.android.settings.inputmethod.InputMethodAndLanguageSettings.java中:  在以下代码获得auto_replace的checkbox的key值: private static final String[] sHardKeyboardKeys = {         "auto_replace", "auto_caps", "auto_punctuate",     }; 在onResume()中来初始化checkbox:四个循环分别为物理键盘的checkbox选项:         // Hard keyboard         if (mHaveHardKeyboard) {             for (int i = 0; i < sHardKeyboardKeys.length; ++i) { /*以下获取Checkbox的对象*/                 CheckBoxPreference chkPref = (CheckBoxPreference)                         mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i]); /*利用Settings.System.getInt()来获取属性值*/                 chkPref.setChecked(                         System.getInt(getContentResolver(), sSystemSettingNames[i], 1) > 0);             }         } 我们可以看到Settings.System.getInt()方法的应用。 在onPreferenceClick()中可以看到对auto_cap选项的设置: if (mHaveHardKeyboard) {                 for (int i = 0; i < sHardKeyboardKeys.length; ++i) {                     if (chkPref == mHardKeyboardCategory.findPreference(sHardKeyboardKeys[i])) { /*将设置的新的属性写如数据库*/                         System.putInt(getContentResolver(), sSystemSettingNames[i],                                 chkPref.isChecked() ? 1 : 0);                         return true;                     }                 }             } 我们可以看到Settings.System.putInt()方法的应用。 通过以上步骤,我们可以详细地明白Settings是怎么获取与设置系统的属性的。

你可能感兴趣的:(Android)