1概述
l 目的
l 实现步骤
l 总结
2目的
SharedPreferences的目的就是实现小数据的持久化,表现在系统设置的数据参数、用户喜好数据设置等,这些数据保证了在用户下次启动时不至于丢失,例如用户将手机设置成了静音模式,那么下次启动时手机的模式依然是静音模式;用户设置了一首好听的来电铃声,下次启动时总不能就变成了另外一首。SharedPreferences就可以实现这个需求。Preference支持的数据类型Boolean、Float、Int、Long、String。如果是结构化的数据类型这就需要采用SQLite等关系型数据库了。所以本文的目的是对小数据的持久化。
3实现步骤
3.1SharedPreferences介绍
SharedPreferences类通过键值对的形式对数据进行保存,该类的实例方法提供如下几种类型的数据:booleans、floats、longs、strings.
当然,为了得到SharedPreferences实例,android提供了如下两种方式:
getSharedPreferences()。分多个xml文件保存你的数据,通过该方法的第一个参数设置文件名来区分你保存的不同的数据文件。
gerPreferences()。一个xml文件来保存数据。所以不需要提供文件名。
我们要保存目标数据,依次要经过如下几个步骤才能达到目的:
1 调用edit(),返回一个SharePreferences.Editor实例
2 通过返回的Editor实例的方法增加数据,这些方法根据数据类型的不同而不同,如:
putBoolean()
putLong()
putFloat()
putInt()
putString()
3 通过调用commit()提交数据
另外,如果要读取我们之前保存的数据,只需要通过SharePreferences实例的方法即可,如getBoolean()、getString()等。
3.2 API sample
下面这个代码片段是上述步骤的一个小例子:
public class Calc extends Activity {
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
3.3 Preferences UI实现
如果希望在单独的Activity中运行preferences应用,需要继承PreferenceActivity类。在PreferenceActivity中,需要提供以PreferenceScreen为根节点的layout布局文件,在该根目录下,可以设计需要的Preferences控件:
CheckBoxPreference 单选框
EditTextPreference 文本编辑框
ListPreference 列表框
PreferenceCategory 组合框,几个基本控件的组合
RingtonePreference 铃声选择
下面的代码片段是实现布局的小样例:
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >
<PreferenceCategory
android:key="set_local"
android:title="我的位置" />
<CheckBoxPreference
android:defaultValue="true"
android:key="apply_wireless"
android:summary="使用无线网络在应用程序(例如Google地图)中查看位置"
android:title="使用无线网络" >
</CheckBoxPreference>
<CheckBoxPreference
android:key="apply_gps"
android:summary="定位到街道级别(需要消耗更多的电量以及天气允许)"
android:title="使用GPS" >
</CheckBoxPreference>
<PreferenceCategory android:title="无线和网络设置" >
</PreferenceCategory>
<CheckBoxPreference
android:key="apply_fly"
android:summary="禁用所有无线连接"
android:title="飞行模式" >
</CheckBoxPreference>
<CheckBoxPreference
android:key="apply_internet"
android:summary="禁用通过USB共享Internet连接"
android:title="Internet共享" >
</CheckBoxPreference>
<CheckBoxPreference
android:key="apply_wifi"
android:summary="打开Wi-Fi"
android:title="Wi-Fi" >
</CheckBoxPreference>
<Preference
android:dependency="apply_wifi"
android:key="wifi_setting"
android:summary="设置和管理无线接入点"
android:title="Wi-Fi设置" >
<!-- 点击时 自定义一个默认跳转Intent action指定隐式Intent -->
<!-- action指定隐式Intent ; targetPackage和targetClass指定显示Intent -->
<intent
android:action="com.feixun.action.seemAction"
android:targetClass="com.feixun.qin.MainActivity"
android:targetPackage="com.feixun.qin" />
</Preference>
<CheckBoxPreference
android:key="apply_bluetooth"
android:summary="启用蓝牙"
android:title="蓝牙" >
</CheckBoxPreference>
<Preference
android:dependency="apply_bluetooth"
android:key="bluetooth_setting"
android:summary="管理连接、设备设备名称和可检测性"
android:title="蓝牙设置" >
</Preference>
<EditTextPreference
android:defaultValue="123"
android:key="number_edit"
android:title="输入电话号码" >
</EditTextPreference>
<ListPreference
android:dialogTitle="选择部门"
android:entries="@array/department"
android:entryValues="@array/department_value"
android:key="depart_value"
android:title="部门设置" >
</ListPreference>
<RingtonePreference
android:key="ring_key"
android:ringtoneType="all"
android:showDefault="true"
android:showSilent="true"
android:title="铃声" >
</RingtonePreference>
</PreferenceScreen>
数组应用的string.xml文件:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="apply_wifi" value="true" />
<string name="number_edit">123</string>
<string name="ring_key">content://settings/system/ringtone</string>
<boolean name="apply_fly" value="false" />
<boolean name="apply_bluetooth" value="false" />
<string name="depart_value">001</string>
<boolean name="apply_gps" value="true" />
<boolean name="apply_wireless" value="true" />
</map>
对Preferences控件组要属性的解释:
Key:唯一标识,作为键值对的KEY
Title:标题
Summary:概述,对Preference的描述,相当于副标题
在你的Activity中引入Preferences布局文件(与普通Activity引入布局文件区别开来):
addPreferencesFromResource(R.layout.mypeference);
3.4 主要接口
l Preference.OnPreferenceChangeListener
当Preference的值将要改变时触发
l Preference.OnPreferenceClickListener
当Preference被点击时触发
主要接口用于对preferences触发的响应。对各个需要保存的键值对做的逻辑处理可以通过实现上述接口来实现:
// 当Preference的值发生改变时触发该事件
public boolean onPreferenceChange(Preference preference, Object objValue) {
//your code here
//...
}
3.5 保存的Preferences文件
用户选择保存的键值对以XML文件保存,默认保存的路径:data->data->your app package name ->share_prefs。这个可以在eclipse的FileExplorer中查看。示例如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="apply_wifi" value="true" />
<string name="number_edit">123</string>
<string name="ring_key">content://settings/system/ringtone</string>
<boolean name="apply_fly" value="false" />
<boolean name="apply_bluetooth" value="false" />
<string name="depart_value">001</string>
<boolean name="apply_gps" value="true" />
<boolean name="apply_wireless" value="true" />
</map>
4总结
Preferences是android数据存储的一种方法(另外几种是:内部文件存储、SD卡存储、SQLite数据库存储、HTTP获取等),对于键值对的数据使用Preferences是再好不过了。因此,在实际应用当中,根据需求的不同选择android平台提供的数据处理方法将会给程序开发带来很好的用户体验。