中主要提供了三种方法用于得到 SharedPreferences 对象。
此方法接收两个参数,第一个参数用于指定 SharedPreferences文件的名称,如果指
定的文件不存在则会创建一个,SharedPreferences 文件都是存放在/data/data/<package
name>/shared_prefs/目录下的。第二个参数用于指定操作模式,主要有两种模式可以选
择,MODE_PRIVATE 和 MODE_MULTI_PROCESS。MODE_PRIVATE 仍然是默认的操
作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个
SharedPreferences文件进行读写。MODE_MULTI_PROCESS则一般是用于会有多个进程中
对同一个 SharedPreferences文件进行读写的情况。类似地,MODE_WORLD_READABLE
和 MODE_WORLD_WRITEABLE 这两种模式已在 Android 4.2 版本中被废弃。
2. Activity 类中的 getPreferences()方法
这个方法和 Context 中的 getSharedPreferences()方法很相似,不过它只接收一个操
作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences 的文
件名。
3. PreferenceManager 类中的 getDefaultSharedPreferences()方法
这是一个静态方法,它接收一个 Context 参数,并自动使用当前应用程序的包名作
为前缀来命名 SharedPreferences 文件。
得到了 SharedPreferences对象之后,就可以开始向 SharedPreferences文件中存储数据了,
主要可以分为三步实现。
2. 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用
putBoolean 方法,添加一个字符串则使用 putString()方法,以此类推。
3. 调用 commit()方法将添加的数据提交,从而完成数据存储操作。
SharedPreferences存储的用法吧。新建一个 SharedPreferencesTest项目,然后修改 activity_main.xml
中的代码,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save data"
/>
</LinearLayout>
这里我们不做任何复杂的功能,只是简单地放置了一个按钮,用于将一些数据存储到
SharedPreferences文件当中。然后修改 MainActivity 中的代码,如下所示:
public class MainActivity extends Activity {
private Button saveData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
saveData = (Button) findViewById(R.id.save_data);
saveData.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
SharedPreferences.Editor editor = getSharedPreferences("data",
MODE_PRIVATE).edit();
editor.putString("name", "Tom");
editor.putInt("age", 28);
editor.putBoolean("married", false);
editor.commit();
}
});
}
}
可 以看到,这里首先给按钮注册了一个点击事件,然后在点击事件中通过
getSharedPreferences()方法指定SharedPreferences的文件名为data,并得到了SharedPreferences.Editor
对象。接着向这个对象中添加了三条不同类型的数据,最后调用 commit()方法进行提交,从
而完成了数据存储的操作。
可以看到,我们刚刚在按钮的点击事件中添加的所有数据都已经成功保存下来了,并且
SharedPreferences 文件是使用 XML 格式来对数据进行管理的。
那么接下来我们自然要看一看,如何从 SharedPreferences 文件中去读取这些数据了。
修改 activity_main.xml 中的代码,如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<Button
android:id="@+id/save_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Save data"
/>
<Button
android:id="@+id/restore_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Restore data"
/>
</LinearLayout>
这里增加了一个还原数据的按钮,我们希望通过点击这个按钮来从 SharedPreferences文
件中读取数据。修改 MainActivity 中的代码,如下所示:
public class SharedPreferencesActivity extends Activity { private Button saveData; private Button restoreData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.sharedpreferences); saveData = (Button) findViewById(R.id.save_data); restoreData = (Button) findViewById(R.id.restore_data); saveData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences.Editor editor = getSharedPreferences("data", MODE_PRIVATE).edit(); editor.putString("name", "Tom"); editor.putInt("age", 28); editor.putBoolean("married", false); editor.commit(); } }); restoreData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences pref = getSharedPreferences("data", MODE_PRIVATE); String name = pref.getString("name", ""); int age = pref.getInt("age", 0); boolean married = pref.getBoolean("married", false); Log.d("SharedActivity", "name is " + name); Log.d("SharedActivity", "age is " + age); Log.d("SharedActivity", "married is " + married); } }); } }
可以看到,我们在还原数据按钮的点击事件中首先通过 getSharedPreferences()方法得到
了 SharedPreferences 对象,然后分别调用它的 getString()、getInt()和 getBoolean()方法去获取
前面所存储的姓名、年龄和是否已婚,如果没有找到相应的值就会使用方法中传入的默认值
来代替,最后通过 Log 将这些值打印出来。