1、android文件存储

对Android系统了解的都知道,Android系统有四种基本的数据保存方法,一是SharedPreference,二是文件,三是SQLite,四是ContentProvider。看出来了吧,Preference,对就是使用SharedPreferneces以键值对的形式进行保存的。

2、SharedPreferneces

做软件开发应该都知道,很多软件会有配置文件,里面存放这程序运行当中的各个属性值,由于其配置信息并不多,如果采用数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率,因此我们使用键值这种一一对应的关系来存放这些配置信息。SharedPreferences正是Android中用于实现这中存储方式的技术。
        SharedPreferences是以键值对的形式存储数据的,其使用非常简单,能够轻松的存放数据和读取数据。

在具体介绍Android的设置界面的实现之前,我们先来介绍一下预备知识,就是Android数据持久化方法中最简单的一种,即使用Preferences的键值对存储方式。这种方式主要用来存储比较简单的一些数据,而且是标准的Boolean、Int、Float、Long、String等类型。

android.content.SharedPreferences是一个接口,用来获取和修改持久化存储的数据。有三种获取系统中保存的持久化数据的方式:

1). public SharedPreferences getPreferences (int mode)
通过Activity对象获取,获取的是本Activity私有的Preference,保存在系统中的xml形式的文件的名称为这个Activity的名字,因此一个Activity只能有一个,属于这个Activity。
        2). public SharedPreferences getSharedPreferences (String name, int mode)
因为Activity继承了ContextWrapper,因此也是通过Activity对象获取,但是属于整个应用程序,可以有多个,以第一参数的name为文件名保存在系统中。
        3). public static SharedPreferences getDefaultSharedPreferences (Context context)
PreferenceManager的静态函数,保存PreferenceActivity中的设置,属于整个应用程序,但是只有一个,Android会根据包名和PreferenceActivity的布局文件来起一个名字保存。
        通过以上方式取得SharedPreferences后就可以对数据进行读取或者保存了。
        保存方式如下:

  1. String STORE_NAME = "Settings";
  2. SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
  3. SharedPreferences.Editor editor = settings.edit();
  4. editor.putInt("sourceType", 0);
  5. editor.commit();

获得SharedPreferences,如果需要进行保存等修改操作,首先得通过其edit()方法获得SharedPreferences.Editor,然后就可以通过putInt、putString等方法以键值对(key-value)的方式保存数据,或者remove移除某个键(key),及调用clear方法删除所有内容。最后需要调用commit方法是使修改生效。
        读取方式如下:

  1. SharedPreferences settings = getSharedPreferences(STORE_NAME, MODE_PRIVATE);
  2. int source = settings.getInt("sorceType", 1);

读取就更加简单了,只要获得SharedPreferences后,就可以通过getInt、getString等方法获取对应键(key)保存着的数据,如果没有找到key,则返回第二个参数作为默认值。

2、PreferencesActivity

在Android开发过程中我们有很大的机会需要用到参数设置功能,那么在Android应用中,我们如何实现参数设置界面及参数存储呢,下面我们来介绍一下Android中的一个特殊Activity–PreferencesActivity。
        PreferencesActivity是Android中专门用来实现程序设置界面及参数存储的一个Activity。

2.1 创建PreferencesActivity

如何创建一个PreferenceActivity。 其实Eclipse提供了相应的创建工具,和创建Layout是基本相同的。步骤如下:
创建Android项目,并添加一个Android xml文件。注意,这次选择的不是Layout,而是Preference,而且注意Folder路径是 res/xml.


        添加完成之后,在res/xml/下打开添加的preference.xml文件。可以看到Android也为我们提供两种编辑模式,可视化的结构设计及xml源码设计。推荐使用structure进行创建。如图所示:

2.2 PrefeneceActivity的基本组成

下面我们看看PrefeneceActivity都提供了哪几种元素可供使用。点击Add按钮,在打开的新窗口中可以看到以下几项:

CheckBoxPreference:CheckBox选择项,对应的值的ture或flase。如图:

EditTextPreference:输入编辑框,值为String类型,会弹出对话框供输入。

ListPreference: 列表选择,弹出对话框供选择。

Preference:只进行文本显示,需要与其他进行组合使用。

PreferenceCategory:用于分组。效果如下:

PreferenceScreen:PreferenceActivity的根元素,必须为它。
RingtonePreference:系统玲声选择。

OK,Preferenc的基本元素介绍完毕,下一节将使用它们创建一个完整的Preference并进行显示。

2.3 PreferenceActivity实例

分析MusicPlayer Setting,第一部分为“我的位置”,包括“使用无线网线”和“使用GPS”两个部分,而且都是CheckBox,根据上节学习,应该包括一个PreferenceCategory和两个CheckBoxPreference。
Xml代码

  1. <PreferenceCategory android:title="我的位置" android:key="set_local">
  2. <CheckBoxPreference android:key="apply_wifi"
  3. android:summary="使用无线网络在应用程序(例如Google地图)中查看位置"
  4. android:title="使用无线网络" android:defaultValue="true">
  5. </CheckBoxPreference>
  6. <CheckBoxPreference android:key="apply_gps"
  7. android:summary="定位到街道级别(需要消耗更多的电量以及天气允许)"
  8. android:title="使用GPS">
  9. </CheckBoxPreference>
  10. </PreferenceCategory>

以上代码当然也可以用Android提供的IDE工具直接生成。视频结构如下:

PreferenceCategory属性分析:
         title:显示的标题
         key:唯一标识(至少在同一程序中是唯一),SharedPreferences也将通过此Key值进行数据保存,也可以通过key值获取保存的信息 (以下相同)。
CheckBoxPreference属性分析:
        Key:唯一标识.
        title:显示标题(大字体显示)
       summary:副标题(小字体显示)
       defaultValue:默认值(当然,此处只能是true或false了)
Preference.xml的第二部分为“无线和网络设置”,此部分包括的内容比较多,也稍微复杂,一步一步来分析。
xml代码:

  1. <PreferenceCategory android:title="无线和网络设置">
  2. <CheckBoxPreference android:key="apply_fly"
  3. android:summary="禁用所有无线连接" android:title="飞行模式">
  4. </CheckBoxPreference>
  5. <CheckBoxPreference android:key="apply_internet"
  6. android:summary="禁用通过USB共享Internet连接"
  7. android:title="Internet共享">
  8. </CheckBoxPreference>
  9. <CheckBoxPreference android:key="apply_wifi"
  10. android:summary="打开Wi-Fi" android:title="Wi-Fi">
  11. </CheckBoxPreference>
  12. <Preference android:summary="设置和管理无线接入点" android:title="Wi-Fi设置"
  13. android:dependency="apply_wifi" android:key="wifi_setting">
  14. </Preference>
  15. <CheckBoxPreference android:key="apply_bluetooth"
  16. android:summary="启用蓝牙" android:title="蓝牙">
  17. </CheckBoxPreference>
  18. <Preference android:summary="管理连接、设备设备名称和可检测性"
  19. android:title="蓝牙设置" android:dependency="apply_bluetooth"
  20. android:key="bluetooth_setting">
  21. </Preference>
  22. <EditTextPreference android:key="number_edit"
  23. android:title="输入电话号码">
  24. </EditTextPreference>
  25. <ListPreference android:title="部门设置" android:entries="@array/department"
  26. android:entryValues="@array/department_value"
  27. android:dialogTitle="选择部门"
  28. android:key="depart_value">
  29. </ListPreference>
  30. <RingtonePreference android:ringtoneType="all" android:title="玲聲"
  31. android:showDefault="true" android:key="ring_key"
  32. android:showSilent="true">
  33. </RingtonePreference>
  34. </PreferenceCategory>

对应的Structure图:

第二部分中前三个都为CheckBoxPreference,不心多说,从<Preference android:key="bluetooth_setting"/>开始。
Preference属性分析:
       Key:唯一标识.
        title:显示标题(大字体显示)
       summary:副标题(小字体显示)
     dependency:附属(嘛意思),即标识此元素附属于某一个元素(通常为CheckBoxPreference),dependency值为所附属元素的key。上面代码中的Preference元素附属于key等于“apply_bluetooth”的CheckPreference元素,当CheckPreference值为true时,Preference则为可用,否则为不可用。
EditTextPreperence属性分析:
    Key:唯一标识.
     title:显示标题(大字体显示)
ListPreference属性分析:
   Key:唯一标识.
   title:显示标题(大字体显示)
  dialogTitle:弹出对话框的标题
 entries:列表中显示的值。为一个数组,通读通过资源文件进行设置。
entryValues:列表中实际保存的值,也entries对应。为一个数组,通读通过资源文件进行设置。以下代码显示的是arrays.xml文件中内容:

  1. <resources>
  2. <string-array name="department">
  3. <item>综合部</item>
  4. <item>行政部</item>
  5. <item>外贸部</item>
  6. </string-array>
  7. <string-array name="department_value">
  8. <item>001</item>
  9. <item>002</item>
  10. <item>003</item>
  11. </string-array>
  12. </resources>

点击“Add”按钮,就会添加新的标签,我们依次添加一个CheckBoxPreference和ListPreference。属于CheckBoxPreference的特有属性主要为Summary On和Summary Off,比较好理解。下面具体来看下ListPreference属性的填写:

我们可以看到,ListPreference除了继承自Preference的属性外,还有自己ListPreference的属性和继承自DialogPreference的属性。其中属于ListPreference的属性有两个:Entries填的为一个字符串数组,是列表显示出来的值,而Entry Values是长度对应的字符串数组,是和Entries对应的具体的值。DialogPreference只要填一个Dialog title标题和一个取消按钮显示的字即可。在Preference属性的Dependency中我们填写上面一个CheckBoxPreference的Key,这样就会只有在CheckBoxPreference勾选时这个ListPreference才有效。

最后把java文件中的addPreferencesFromResource(R.xml.preferences);改为addPreferencesFromResource(R.xml.preferencesii);
保存运行,看下效果。

RingtonePreference :玲声(暂时没有用到过),暂时略过。
        OK,Preference.xml内容已经分析完毕,属性都大致相同,相信亲自动力一试也就那么回事。那么如何把Preference.xml中内容展现出来呢?
Layout是通过继续自Activity的类来进行显示的,前面提到过,PreferenceActivity是专门用于显示preference的,所以只要创建一个继承自PreferenceActivity类即可。代码如下:

  1. public class Setting extends PreferenceActivity {
  2. @Override
  3. public void onCreate(Bundle savedInstanceState) {
  4. super.onCreate(savedInstanceState);
  5. // 所的的值将会自动保存到SharePreferences
  6. addPreferencesFromResource(R.xml.preference);
  7. }
  8. }

接下来就是运行程序,显示劳动成果。至此,工作已经完成大半,所有的值都会保存到SharedPreferences中,我们也可以读取到保存的结果。

2.4 如何获取ListPreference中选中的值

研究了一天,貌似ListPreference中根本就没有什么回调函数可以用
于是,向上一层,把注意力集中于SharedPreferences,
发现有这么个接口:onSharedPreferenceChanged
抱着试试看的态度,实现了该接口,发现此方法可行,先将部分代码分享如下:

  1. package yinger.firewall;
  2. import android.content.SharedPreferences;
  3. import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
  4. import android.os.Bundle;
  5. import android.preference.CheckBoxPreference;
  6. import android.preference.ListPreference;
  7. import android.preference.Preference;
  8. import android.preference.PreferenceActivity;
  9. import android.preference.PreferenceManager;
  10. import android.preference.PreferenceScreen;
  11. public class CallFireWall extends PreferenceActivity implements
  12. OnSharedPreferenceChangeListener {
  13. ListPreference lp = null;
  14. String whiteMode = "1";
  15. String blackMode = "2";
  16. /** Called when the activity is first created. */
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. addPreferencesFromResource(R.xml.preferences);
  21. this.setTitle("Ying_er" + "  Call Safe");
  22. SharedPreferences prefs = PreferenceManager
  23. .getDefaultSharedPreferences(this);
  24. prefs.registerOnSharedPreferenceChangeListener(this);
  25. lp = (ListPreference) findPreference(getString(R.string.pref_mode_key));
  26. }
  27. @Override
  28. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
  29. Preference preference) {
  30. // TODO Auto-generated method stub
  31. return super.onPreferenceTreeClick(preferenceScreen, preference);
  32. }
  33. @Override
  34. public void onSharedPreferenceChanged(SharedPreferences sharedPreferences,
  35. String key) {
  36. // TODO Auto-generated method stub
  37. System.out.println("onSharedPreferenceChanged");
  38. if (key == getString(R.string.pref_mode_key)){
  39. System.out.println(lp.getValue());
  40. if(lp.getValue().equals(whiteMode)){
  41. }
  42. }
  43. }
  44. }

注意:该事件需要注册。既:

  1. prefs.registerOnSharedPreferenceChangeListener(this);

实际上,使用如下方法也是可以得到值的:

  1. PreferenceManager.getDefaultSharedPreferences(context).getBoolean(R.string.pref_mode_key, DEFAULT);

2.5 分析Preference事件

★ 在PreferenceActivity方法中,一个比较重要的监听点击事件方法为:
         public booleanonPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference)
                           说 明 : 当Preference控件被点击时,触发该方法。
           参数说明: preference   点击的对象。
           返回值:   true  代表点击事件已成功捕捉,无须执行默认动作或者返回上层调用链。 例如,不跳转至默认Intent。
                      false 代表执行默认动作并且返回上层调用链。例如,跳转至默认Intent。
      在我们继承PreferenceActivity的Activity可以重写该方法,来完成我们对Preference事件的捕捉。
     相信通过前面的介绍,你一定知道了如何使用了Preference家族并且对其触发方法。下面我们抛出另外两枚炸弹——Preference相关的两个重要监听接口。
   ★  Preference.OnPreferenceChangeListener     该监听器的一个重要方法如下:
        boolean onPreferenceChange(Preference preference,Object objValue)
             说明:  当Preference的元素值发送改变时,触发该事件。
             返回值:true  代表将新值写入sharedPreference文件中。
                     false 则不将新值写入sharedPreference文件
  ★   Preference.OnPreferenceClickListener      该监听器的一个重要方法如下:
         public booleanonPreferenceClick(Preference preference)
             说明:当点击控件时触发发生,可以做相应操作。                       
    那么当一个Preference控件实现这两个接口时,当被点击或者值发生改变时,触发方法是如何执行的呢?事实上,它的触发规则如下:
      1 先调用onPreferenceClick()方法,如果该方法返回true,则不再调用onPreferenceTreeClick方法 ;
       如果onPreferenceClick方法返回false,则继续调用onPreferenceTreeClick方法。
      2 onPreferenceChange的方法独立与其他两种方法的运行。也就是说,它总是会运行。

2.6 OnPreferenceChangeListener

以上我们分别介绍了Preference对数据的保存及PreferenceActivity设置界面。当PreferenceActivity中的内容改变时,Android系统会自动进行保存和持久化维护,我们只需要在要用的设置界面中数据的地方进行读取就可以了。同时Android还提供了OnPreferenceClickListener和OnPreferenceChangeListener两个与Preference相关的监听接口,当PreferenceActivity中的某一个Preference进行了点击或者改变的操作时,都会回调接口中的函数,这样可以第一个时间向其他Activity等通知系统设置进行了改变。
        下面我们以一个具体的Demo说明PreferenceActivity和其监听接口的使用。
        新建一个工程AndroidPreferenceDemoII,并按上面的步骤添加xml文件夹和其内容Preferenceii.xml,还有values文件夹中的array.xml和strings.xml。
        新建一个名为Settings的class,内容为:

  1. //继承PreferenceActivity,并实现OnPreferenceChangeListener和OnPreferenceClickListener监听接口
  2. public class Settings extends PreferenceActivity implements OnPreferenceChangeListener,
  3. OnPreferenceClickListener{
  4. //定义相关变量
  5. String updateSwitchKey;
  6. String updateFrequencyKey;
  7. CheckBoxPreference updateSwitchCheckPref;
  8. ListPreference updateFrequencyListPref;
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. //从xml文件中添加Preference项
  13. addPreferencesFromResource(R.xml.preferencesii);
  14. //获取各个Preference
  15. updateSwitchKey = getResources().getString(R.string.auto_update_switch_key);
  16. updateFrequencyKey = getResources().getString(R.string.auto_update_frequency_key);
  17. updateSwitchCheckPref = (CheckBoxPreference)findPreference(updateSwitchKey);
  18. updateFrequencyListPref = (ListPreference)findPreference(updateFrequencyKey);
  19. //为各个Preference注册监听接口
  20. updateSwitchCheckPref.setOnPreferenceChangeListener(this);
  21. updateSwitchCheckPref.setOnPreferenceClickListener(this);
  22. updateFrequencyListPref.setOnPreferenceChangeListener(this);
  23. updateFrequencyListPref.setOnPreferenceClickListener(this);
  24. }
  25. @Override
  26. public boolean onPreferenceChange(Preference preference, Object newValue) {
  27. // TODO Auto-generated method stub
  28. Log.v("SystemSetting", "preference is changed");
  29. Log.v("Key_SystemSetting", preference.getKey());
  30. //判断是哪个Preference改变了
  31. if(preference.getKey().equals(updateSwitchKey))
  32. {
  33. Log.v("SystemSetting", "checkbox preference is changed");
  34. }
  35. else if(preference.getKey().equals(updateFrequencyKey))
  36. {
  37. Log.v("SystemSetting", "list preference is changed");
  38. }
  39. else
  40. {
  41. //如果返回false表示不允许被改变
  42. return false;
  43. }
  44. //返回true表示允许改变
  45. return true;
  46. }
  47. @Override
  48. public boolean onPreferenceClick(Preference preference) {
  49. // TODO Auto-generated method stub
  50. Log.v("SystemSetting", "preference is clicked");
  51. Log.v("Key_SystemSetting", preference.getKey());
  52. //判断是哪个Preference被点击了
  53. if(preference.getKey().equals(updateSwitchKey))
  54. {
  55. Log.v("SystemSetting", "checkbox preference is clicked");
  56. }
  57. else if(preference.getKey().equals(updateFrequencyKey))
  58. {
  59. Log.v("SystemSetting", "list preference is clicked");
  60. }
  61. else
  62. {
  63. return false;
  64. }
  65. return true;
  66. }
  1. <strong></strong>

当然重写PreferenceActivity的 onPreferenceTreeClick的方法就可以了,通过参数preference来判断是对那一个元素进行的,并根据需要进行操作。

  1. @Override
  2. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
  3. Preference preference) {
  4. return false;
  5. }

2.7 OnPreferenceChangeListener与OnPreferenceClickListener的区别

两种监听器OnPreferenceChangeListener和OnPreferenceClickListener,OnPreferenceClickListener的意思好理解,但是OnPreferenceChangeListener就不好懂了,所以就写了个Demo分析了一下,代码如下:

    1. <p></p><pre name="code" class="java">package com.luther.test;
    2. import com.luther.test.R;
    3. import android.content.SharedPreferences;
    4. import android.os.Bundle;
    5. import android.preference.CheckBoxPreference;
    6. import android.preference.EditTextPreference;
    7. import android.preference.ListPreference;
    8. import android.preference.Preference;
    9. import android.preference.Preference.OnPreferenceChangeListener;
    10. import android.preference.Preference.OnPreferenceClickListener;
    11. import android.preference.PreferenceActivity;
    12. import android.preference.PreferenceManager;
    13. import android.preference.PreferenceScreen;
    14. import android.widget.Toast;
    15. public class PreferenceDemoActivity extends PreferenceActivity
    16. implements OnPreferenceChangeListener, OnPreferenceClickListener{
    17. private ListPreference mList1Prefs;
    18. private ListPreference mList2Prefs;
    19. private CheckBoxPreference mCheckPrefs;
    20. private EditTextPreference mEditPrefs;
    21. private SharedPreferences mSharedPrefs;
    22. /** Called when the activity is first created. */
    23. @Override
    24. public void onCreate(Bundle savedInstanceState) {
    25. super.onCreate(savedInstanceState);
    26. addPreferencesFromResource(R.xml.preference);
    27. initViews();
    28. }
    29. private void initViews(){
    30. //得到以包命名的SharedPreferences
    31. mSharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    32. mList1Prefs = (ListPreference) findPreference("key_call_config");
    33. mList2Prefs = (ListPreference) findPreference("key_msg_config");
    34. mCheckPrefs = (CheckBoxPreference) findPreference("switch");
    35. mEditPrefs = (EditTextPreference) findPreference("autoreply_text_cpntent");
    36. mList1Prefs.setOnPreferenceClickListener(this);
    37. mList1Prefs.setOnPreferenceChangeListener(this);
    38. mList2Prefs.setOnPreferenceChangeListener(this);
    39. mList2Prefs.setOnPreferenceClickListener(this);
    40. }
    41. @Override
    42. public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
    43. Preference preference) {
    44. if(preference == mEditPrefs){
    45. String toastStr = mEditPrefs.getTitle() + "\n"
    46. + "Content: " + mEditPrefs.getText();
    47. showToast(toastStr);
    48. }
    49. return super.onPreferenceTreeClick(preferenceScreen, preference);
    50. }
    51. public boolean onPreferenceClick(Preference preference) {
    52. String prefsValue = mSharedPrefs.getString(preference.getKey(), "-1");
    53. showToast(prefsValue);
    54. return false;
    55. }
    56. public boolean onPreferenceChange(Preference preference, Object newValue) {
    57. if(mList1Prefs == preference){
    58. String prefsValue = mSharedPrefs.getString(preference.getKey(), "-1");
    59. showToast(prefsValue);
    60. }
    61. if(mList2Prefs == preference){
    62. String prefsValue = newValue.toString();
    63. showToast(prefsValue);
    64. mList2Prefs.setValue(prefsValue);
    65. }
    66. return false;
    67. }
    68. private void showToast(String arg){
    69. Toast.makeText(this, arg, Toast.LENGTH_SHORT).show();
    70. }
    71. }</pre>        程序原理:用一个ListPreference分别注册这两个监听器,然后用Tosat看他们在什么时候响应。<br>
    72. .../res/xml/preference文件如下:
    73. <p></p>
    74. <p></p>
    75. <pre name="code" class="java"><?xml version="1.0" encoding="utf-8"?>
    76. <PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
    77. android:title="@string/settings">
    78. <PreferenceCategory
    79.     android:title="@string/general_settings">
    80. <ListPreference
    81.        android:key="key_call_config"
    82. android:title="@string/incoming_call_come"
    83. android:dialogTitle="@string/incoming_call_come"
    84. android:entries="@array/response_entries"
    85. android:entryValues="@array/response_entry_values"/>
    86. <ListPreference
    87.        android:key="key_msg_config"
    88. android:title="@string/message_come"
    89. android:dialogTitle="@string/message_come"
    90. android:entries="@array/response_entries"
    91. android:entryValues="@array/response_entry_values"/>
    92. </PreferenceCategory>
    93. <PreferenceCategory
    94.      android:title="@string/user_defined_autoreply_settings">
    95. <CheckBoxPreference
    96.        android:title="@string/autoreply_switch"
    97. android:key="switch"/>
    98. <EditTextPreference
    99.        android:title="@string/user_defined_autoreply_text"
    100. android:key="autoreply_text_cpntent"
    101. android:dependency="switch"
    102. android:dialogTitle="@string/user_defined_autoreply_text"
    103. android:positiveButtonText="@android:string/ok"
    104. android:negativeButtonText="@android:string/cancel"/>
    105. </PreferenceCategory>
    106. </PreferenceScreen></pre>以下是ListPreference的Entries和EntryValues:<br>
    107. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
    108. <resources>
    109. <string-array name="response_entries">
    110. <item>静音</item>
    111. <item>振动</item>
    112. <item>正常响铃</item>
    113. <item>LED灯亮</item>
    114. </string-array>
    115. <string-array name="response_entry_values">
    116. <item>0</item>
    117. <item>1</item>
    118. <item>2</item>
    119. <item>3</item>
    120. </string-array>
    121. </resources></pre>string.xml文件:<br>
    122. <p></p>
    123. <p></p>
    124. <pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
    125. <resources>
    126. <string name="hello">Hello World, PreferenceDemoActivity!</string>
    127. <string name="app_name">PreferenceDemo</string>
    128. <string name="settings">设置</string>
    129. <string name="general_settings">常规设置</string>
    130. <string name="incoming_call_come">来电时</string>
    131. <string name="message_come">来短信时</string>
    132. <string name="user_defined_autoreply_settings">自定义回复设置</string>
    133. <string name="autoreply_switch">自动回复</string>
    134. <string name="user_defined_autoreply_text">自动回复短信</string>
    135. </resources></pre>下面是Demo的主界面:<br>
    136. <p></p>
    137. <p><img src="http://hi.csdn.net/attachment/201203/7/0_13311289314loq.gif" alt=""><br>
    138. </p>
    139. <p>       </p><pre name="code" class="java"><p> 编译好,运行程序:点击mList1Prefs(来电时),Toast显示“-1”。再点击一个选项,对话框消失,Toast显示“-1”,为什么会这样?为什么不是第一次选中时的选项值?
    140. 其实,这是因为设置了OnPreferenceChangeListener。默认情况下,普通的ListPreference第一次选中一个值之后,Android框架会存贮好选中的值,下次打开,会默认选中上次选中的值,但是设置OnPreferenceChangeListener之后,值的存储就要自己来了,详见代码中的mList2Prefs.setValue();“来短信时”这一项就能够正常存贮选中的值。
    141. 现在区别就出来了:
    142. OnPreferenceClickListener:是响应点击preference的事件,比如程序中,一点ListPreference,onPreferenceClick()中就弹出Toast。
    143. OnPreferenceChangeListener:是响应preference的值被改变的事件(此时被改变的值需要自己存贮到SharedPreferences) ,比如程序中,点击ListPreference的某一项,onPreferenceChange()中就会弹出Toast。
    144. 另外:onPreferenceTreeClick()这个方法感觉和OnPreferenceClickListener的回调方法onPreferenceClick()的作用差不多,一样是响应点击的事件。
    145. 回头再看OnPreferenceChangeListener的文档:
    146. Interface definition for a callback to be invoked when the value of this Preference has been changed by the user and is about to be set and/or persisted. This gives the client a chance to prevent setting and/or persisting the value.
    147. 就非常明白了~
    148. </p><p><strong>3、访问其他应用中的Preference</strong></p><p>如果访问其他应用中的Preference,前提条件是:该preference创建时指定了Context.MODE_WORLD_READABLE或者Context.MODE_WORLD_WRITEABLE权限。如:有个<package name>为cn.itcast.action的应用使用下面语句创建了preference。
    149. getSharedPreferences("itcast", Context.MODE_WORLD_READABLE);
    150. 其他应用要访问上面应用的preference,首先需要创建上面应用的Context,然后通过Context 访问preference ,访问preference时会在应用所在包下的shared_prefs目录找到preference :</p></pre><p></p>
    151. <p></p>
    152. <pre name="code" class="java">Context otherAppsContext = createPackageContext("com.oce.action", Context.CONTEXT_IGNORE_SECURITY);
    153. SharedPreferences sharedPreferences = otherAppsContext.getSharedPreferences("config", Context.MODE_WORLD_READABLE);
    154. String name = sharedPreferences.getString("name", "");
    155. int age = sharedPreferences.getInt("age", 0);</pre><br>
    156. <pre name="code" class="java">如果不通过创建Context访问其他应用的preference,也可以以读取xml文件方式直接访问其他应用preference对应的xml文件,如:
    157. File xmlFile = new File(“/data/data/<package name>/shared_prefs/itcast.xml”);//<package name>应替换成应用的包名。</pre><pre name="code" class="java">但是这样直接读取文件,不出意外会碰到权限问题。</pre><pre name="code" class="java"></pre><p></p><pre></pre>
    158. <pre></pre>
    159. <pre></pre>
    160. <pre></pre>
    161. <pre></pre>
    162. <pre></pre>

android基础知识:SharedPreferences和PreferenceActivity的更多相关文章

  1. 【Xamarin开发 Android 系列 4】 Android 基础知识

    原文:[Xamarin开发 Android 系列 4] Android 基础知识 什么是Android? Android一词的本义指“机器人”,同时也是Google于2007年11月5日宣布的基于Li ...

  2. Android基础知识巩固:关于PendingIntent和广播

    平时使用广播的场合比较多,但细节的东西,看过了也没有总结,以至于某些场合有小问题,还是要把原理和属性搞清楚才能运用自如. 其实也是自己比较懒,先看别人的blog,有个概念再去官网看英文的能好理解一些. ...

  3. Android基础知识(一)

    前言 前言 从软件测试最终目的发现问题缺陷来看,Findyou比较认同一个观念,测试的能力大致可以划分成三个能力层次:发现问题.定位问题.预防问题.有机会探讨一下这个分类. 发现问题各种方式方法,比如 ...

  4. android开发学习---linux下开发环境的搭建&& android基础知识介绍

    一.配置所需开发环境 1.基本环境配置 JDK 5或以上版本(仅有JRE不够) (http://www.oracle.com/technetwork/java/javase/downloads/ind ...

  5. Android基础知识大全(精品)

    [1].ProgressBar   <ProgressBar android:id="@+id/progress_bar" android:layout_width=&quo ...

  6. Android基础知识总结

    四大组件之一活动 活动状态 运行状态:活动处于栈顶 暂停状态:活动不处于栈顶,但仍然可见 停止状态:完全不可见 销毁状态:离开返回栈 生存期 onCreate() onStart():不可见到可见调用 ...

  7. Android基础知识-1

    1.Android的Activity任务栈 在Android的系统中,在APP运行时每个APP都会默认有一个任务栈,任务栈的名称以APP的包名命名.任务栈是一中先进后出的结构,APP中每一个调用的Ac ...

  8. 看看android基础知识,谁帮我作答

    无论怎么着,了解一点android的基本知识还是有必要的,就当开阔一些自己的眼界吧. .. . android的四大功能组件是_activity_,_service_,_BroadcastReceiv ...

  9. Android基础知识学习

    IPC  (Inter-Process Communication) 意思是: 进程间的通信,是指两个进程之间进行数据交换的过程. Android中如何开启多进程呢? 只需要给四大组件(Activit ...

随机推荐

  1. Selenium模拟登陆简书

    from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.c ...

  2. TP5视频教程课程内容

    <TP5 视频教程课程内容> 一.ThinkPHP5TP5 官网基础教程, 官网手册作为参考,讲解TP5的使用方法.理解TP的用途 二.TP5大型项目实战及底层源码分析用TP5 做大型电商 ...

  3. 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)

    「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out   [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...

  4. 数据仓库之父——Bill Inmon(转载)

    从此处转载 http://blog.sina.com.cn/s/blog_615f9dba0100f67p.html 比尔·恩门(Bill Inmon),被称为数据仓库之父,最早的数据仓库概念提出者, ...

  5. [BJOI2017]魔法咒语 --- AC自动机 + 矩阵优化

    bzoj 4860   LOJ2180   洛谷P3175 [BJOI2017]魔法咒语 题目描述: Chandra 是一个魔法天才. 从一岁时接受火之教会洗礼之后,Chandra 就显示出对火元素无 ...

  6. 树形DP+(分组背包||二叉树,一般树,森林之间的转换)codevs 1378 选课

    codevs 1378 选课 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond  题目描述 Description 学校实行学分制.每门的必修课都有固定的学分 ...

  7. 按字母顺序排列的IDC函数列表

    http://www.2cto.com/shouce/ida/162.htm 按字母顺序排列的IDC函数列表 下面是函数描述信息中的约定: 'ea' 线性地址 'success' 0表示函数失败:反之 ...

  8. ubuntu systemtap-sdt-dev

    http://kr.archive.ubuntu.com/ubuntu/pool/universe/s/systemtap/systemtap-sdt-dev_3.0-7_amd64.deb

  9. XDroidRequest网络请求框架,新开源

    XDroidRequest 是一款网络请求框架,它的功能也许会适合你.这是本项目的第三版了,前两版由于扩展性问题一直不满意,思考来 思考去还是觉得Google的Volley的扩展性最强,于是借鉴了Vo ...

  10. windows端口

    端口可分为3大类: 1) 公认端口(Well Known Ports):从0到1023,它们紧密绑定于一些服务.通常这些端口的通讯明确表明了某种服务的协议.例如:80端口实际上总是HTTP通讯. 2) ...