Android SharedPreferences完全指南:从入门到精通的共享首选项教程
这是文章《Android共享首选项示例教程》的第1部分(共2部分)。
内容片段:在本教程中,我们将使用Android应用程序中的共享首选项(Shared Preferences)来以键值对的形式存储数据。
Android共享首选项概述
共享首选项允许活动和应用程序保留偏好设置,以键值对的形式存储,类似于Map,即使用户关闭应用程序,这些偏好设置也会持久化。Android将共享首选项设置存储为XML文件,位于DATA/data/{应用程序包}目录下的shared_prefs文件夹中。通过调用Environment.getDataDirectory()可以获取DATA文件夹。SharedPreferences是应用程序特定的,即在执行以下选项之一时数据会丢失:
- 卸载应用程序时
- 清除应用程序数据时(通过设置)
正如其名,主要目的是存储用户指定的配置细节,例如用户特定的设置,使用户保持登录状态。为了访问偏好设置,我们有三个可供选择的API。
- getPreferences():在Activity内部使用,用于访问活动特定的偏好设置
- getSharedPreferences():在Activity(或其他应用程序上下文)中使用,用于访问应用程序级别的偏好设置
- getDefaultSharedPreferences():在PreferenceManager上使用,用于获取与Android整体偏好框架协同工作的共享首选项
在本教程中,我们将使用getSharedPreferences()方法。该方法的定义如下:getSharedPreferences(String PREFS_NAME, int mode),其中PREFS_NAME是文件的名称,mode是操作模式。以下是可适用的操作模式:
- MODE_PRIVATE:默认模式,创建的文件只能由调用应用程序访问
- MODE_WORLD_READABLE:创建全局可读文件非常危险,可能会导致应用程序出现安全漏洞
- MODE_WORLD_WRITEABLE:创建全局可写文件非常危险,可能会导致应用程序出现安全漏洞
- MODE_MULTI_PROCESS:即使共享首选项实例已经加载,此方法也会检查偏好的修改
- MODE_APPEND:这会将新的偏好设置与已存在的偏好设置追加在一起
- MODE_ENABLE_WRITE_AHEAD_LOGGING:数据库打开标志。当设置此标志时,默认会启用预写日志记录
初始化
我们需要一个编辑器来编辑并保存共享偏好设置中的更改。可以使用以下代码来获取共享偏好设置。
SharedPreferences pref = getApplicationContext().getSharedPreferences("MyPref", 0); // 0 - 表示私有模式
Editor editor = pref.edit();
存储数据
为了保存共享参数的更改,使用editor.commit()。
editor.putBoolean("key_name", true); // 存储布尔值 - true/false
editor.putString("key_name", "string value"); // 存储字符串
editor.putInt("key_name", "int value"); // 存储整数
editor.putFloat("key_name", "float value"); // 存储浮点数
editor.putLong("key_name", "long value"); // 存储长整型
editor.commit(); // 提交更改
获取数据
通过调用getString()可以从保存的首选项中检索数据。
pref.getString("key_name", null); // 获取字符串
pref.getInt("key_name", -1); // 获取整数
pref.getFloat("key_name", null); // 获取浮点数
pref.getLong("key_name", null); // 获取长整型
pref.getBoolean("key_name", null); // 获取布尔值
清除或删除数据
使用remove(“key_name”)会删除特定的值。而clear()则会移除所有的数据。
editor.remove("name"); // 将删除名为name的键
editor.remove("email"); // 将删除名为email的键
editor.commit(); // 提交更改
editor.clear();
editor.commit(); // 提交更改
项目结构
安卓共享偏好设置项目的代码
这是《Android共享首选项示例教程》的第二部分(共两部分)。
本节内容:activity_main.xml 布局文件包含两个 EditText 视图,用于存储和显示姓名和电子邮件。三个按钮在 MainActivity 中分别实现了各自的 onClick 功能。
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin" >
<Button
android:id="@+id/btnSave"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:onClick="Save"
android:text="保存" />
<Button
android:id="@+id/btnRetr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:onClick="Get"
android:text="检索" />
<Button
android:id="@+id/btnClear"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignRight="@+id/etEmail"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:onClick="clear"
android:text="清除" />
<EditText
android:id="@+id/etEmail"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="电子邮件"
android:inputType="textEmailAddress"
android:layout_below="@+id/etName"
android:layout_marginTop="20dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<EditText
android:id="@+id/etName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:ems="10"
android:hint="姓名"
android:inputType="text"
android:layout_alignParentTop="true"
android:layout_alignLeft="@+id/etEmail"
android:layout_alignStart="@+id/etEmail" />
</RelativeLayout>
MainActivity.java文件用于通过键值对保存和检索数据。
package com.Olivia.sharedpreferences;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
public class MainActivity extends Activity {
SharedPreferences sharedpreferences;
TextView name;
TextView email;
public static final String mypreference = "mypref";
public static final String Name = "nameKey";
public static final String Email = "emailKey";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
name = (TextView) findViewById(R.id.etName);
email = (TextView) findViewById(R.id.etEmail);
sharedpreferences = getSharedPreferences(mypreference,
Context.MODE_PRIVATE);
if (sharedpreferences.contains(Name)) {
name.setText(sharedpreferences.getString(Name, ""));
}
if (sharedpreferences.contains(Email)) {
email.setText(sharedpreferences.getString(Email, ""));
}
}
public void Save(View view) {
String n = name.getText().toString();
String e = email.getText().toString();
SharedPreferences.Editor editor = sharedpreferences.edit();
editor.putString(Name, n);
editor.putString(Email, e);
editor.commit();
}
public void clear(View view) {
name = (TextView) findViewById(R.id.etName);
email = (TextView) findViewById(R.id.etEmail);
name.setText("");
email.setText("");
}
public void Get(View view) {
name = (TextView) findViewById(R.id.etName);
email = (TextView) findViewById(R.id.etEmail);
sharedpreferences = getSharedPreferences(mypreference,
Context.MODE_PRIVATE);
if (sharedpreferences.contains(Name)) {
name.setText(sharedpreferences.getString(Name, ""));
}
if (sharedpreferences.contains(Email)) {
email.setText(sharedpreferences.getString(Email, ""));
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
}
“mypreference”是用于存储共享首选项键值对的文件名。下图展示了我们项目的最终输出效果:
至此,本教程结束。您可以通过下方链接下载Android共享首选项示例项目。
下载Android共享首选项示例项目。