在程序的运行过程中,我们往往需要保存一定的数据,以便程序在其他场合可以调取这些数据,例如:Activity的状态信息,两个Activity共享的某些数据等。我们暂且把这种功能叫做数据持久化,意如其名,用于相对持久地保存应用程序的数据。
Android有四种保存应用程序数据的方式:
2. File
3. SQLite
4. Content Provider
本文主要讲解SharedPreferences的基本用法。
SharedPreferences是Android提供的保存简单的应用程序数据的类,它通过<键,值>对的方式来保存数据,也就是为需要保存的数据指定一个键,通过检索键找到数据,从而对数据进行读写。<键,值>对保存到一个XML文件中。当需要保存多个数据时,就定义多个键,分别存储。
SharedPreferences是一种轻量级的存储类,用于保存Activity的状态,或者一些简单的数据。下面通过一个例子来学习SharedPreferences的使用方法。
示例:建立两个Activity,一个使用SharedPreferences写入键值对,另外一个使用SharedPreferences读取这个键值对,从而实现两个Activity之间的数据共享。
1. 使用Eclipse创建一个Android项目,命名为MyTest_SharedPreferences。
2. 在/res/layout文件夹下,修改activity_main.xml文件,添加一个编辑框和一个按钮,编辑框用于输入需要保存的内容,单击按钮会将文本框中的内容保存下来,并跳转到读取数据的Activity。activity_main.xml的代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 编辑框控件,id为txtString -->
<EditText
android:id="@+id/txtString"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<!-- 按钮控件,id为btnSave,点击后触发onSave方法 -->
<Button
android:id="@+id/btnSave"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Save"
android:onClick="onSave"/>
</LinearLayout>
3. 在MainActivity.java中添加如下内容:
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
//点击按钮触发onSave方法,将文本框中的内容以键值对的方式写入MyTest_SharedPreferences。xml中
public void onSave(View view){
//创建一个SharedPreferences对象appPrefs,关联的xml文件为MyTest_SharedPreferences.xml
//MODE_PRIVATE表示只有创建的应用程序能够打开此文件
SharedPreferences appPrefs =
getSharedPreferences("MyTest_SharedPreferences",MODE_PRIVATE);
//创建一个Editor对象,用于向xml文件中写数据
SharedPreferences.Editor prefsEditor = appPrefs.edit();
//获取EditText控件中的文本,保存在str中
String str = ((EditText)findViewById(R.id.txtString)).getText().toString();
//使用putString函数,将键值对<SavedData,str>写入xml文件
prefsEditor.putString("SavedData", str);
//通过commit方法提交数据,保存完毕
prefsEditor.commit();
//跳转到ReadActivity
startActivity(new Intent("ReadActivity"));
}
}
使用SharedPreferences保存数据的步骤是:
(1)创建SharedPreferences对象:SharedPreferences SP对象名= getSharedPreferences(xml文件名,操作模式);
(2)创建Editor对象:SharedPreferences.Editor SP_E对象名= SP对象名.edit();
(3)使用Editor的putString方法写入键值对:SP_E对象名.purString(键, 值);
(4)使用Editor的commit方法提交数据:SP_E对象名.commit();
用于保存键值对的xml文件保存在/data/data/shared_prefs文件夹下,其定义了应用程序指定的键和对应的值,想要查看此xml文件,需要有root权限。
4. 下面创建读取数据的Activity,首先在/res/layout文件夹下新建一个xml文件,命名为readdata.xml,并添加如下内容:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<!-- 用于显示读取数据的文本框,id为txtString2 -->
<EditText
android:id="@+id/txtString2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"/>
<!-- 按钮控件,id为btnRead,点击后触发onRead方法 -->
<Button
android:id="@+id/btnRead"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Read"
android:onClick="onRead"/>"
</LinearLayout>
5. 在src文件夹中添加一个类,命名为ReadActivity,并添加如下代码:
import android.app.Activity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
public class ReadActivity extends Activity{
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.readdata);
}
//点击按钮触发onRead方法,将指定的键值对读取出来,并显示在文本框中
public void onRead(View view){
//创建一个SharedPreferences对象appPrefs,关联的文件为MyTest_SharedPreferences.xml
//MODE_PRIVATE表示只有创建的应用程序能够打开此文件
SharedPreferences appPrefs =
getSharedPreferences("MyTest_SharedPreferences",MODE_PRIVATE);
//将键为SavedData对应的值提取出来,并保存在str中
String str = appPrefs.getString("SavedData", "");
//定义一个EditText对象et,并使之与id为txtString2的EditText控件关联
EditText et = (EditText)findViewById(R.id.txtString2);
//将str的内容显示在et上
et.setText(str);
}
}
使用SharedPreferences读取数据的步骤是:
(1)创建SharedPreferences对象:SharedPreferences SP对象名= getSharedPreferences(xml文件名,操作模式);
(2)使用getString方法读取指定键的值:SP对象名.getString(键,"");
6. 两个Activity都已经写好,下面在AndroidManifest.xml中添加ReadActivity类的条目:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mytest_sharedpreferences"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.mytest_sharedpreferences.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:label="Read Activity"
android:name=".ReadActivity">
<intent-filter >
<action android:name="ReadActivity"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
</manifest>
7. 调试应用程序,进入应用后,在文本框中输入字符串,例如:“需要保存的数据”,如下图所示:
8. 点击Save按钮,进入ReadActivity界面,如下图所示:
9. 点击Read,读取上一个Activity保存的数据,并显示在文本框中,如下图所示:
SharedPreferences的使用相对简单,在需要保存数据的地方添加写入的代码,在需要读取数据的时候添加读取的代码即可,但是SharedPreferences适用于保存简单的数据,如果需要保存的数据量大,结构复杂,则需要考虑文件、数据库等其他数据保存方式。