目录
SharedPreferences 简介
- SharedPreferences(偏好设定)——保存用户偏好参数,注意不适合存在大数据!
- 当应用想要保存用户的一些偏好参数,比如是否自动登陆?是否记住账号密码?是否在 Wifi 下才能联网?以及登录的账号密码等等相关信息,此时如果使用数据库,会显得有点大材小用!
- 把上面这些配置信息称为用户的偏好设置,这些配置信息通常是保存在特定的文件中,比如 windows 使用 ini 文件, 而 Java 中通常使用 properties 属性文件或 xml 文件。
- Android 中通常使用 一个轻量级的存储类——SharedPreferences 来保存用户的偏好参数,SharedPreferences 也是使用 xml 文件,然后类似于 Map 集合,使用 键—值 形式来存储数据,方便存取。
- SharedPreferences 的数据存储在应用的私有目录下,除非是卸载 APP,否则数据就一直在的。
- SharedPreferences 使用简要流程图:
代码演示
- 需求效果如下,第一次设置时,输入框为空,必须用户手动输入账号与密码,再点击 "保存" 按钮进行保存,保存成功之后关掉 APP ,再次打开 APP 时数据自动进行回显。
- 布局文件 activity_main.xml 文件内容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<EditText
android:id="@+id/userName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="账号" />
<EditText
android:id="@+id/userPass"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密码"
android:inputType="textPassword" />
<Button
android:id="@+id/buttonLogin"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="保存" />
</LinearLayout>
- 偏好设定帮助类 SharedHelper.java 文件内容如下:
package com.lct.www.yuan.helper;
import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
/**
* SharedPreferences(偏好设定帮助类)
*/
public class SharedHelper {
/**
* 应用环境上下文
*/
private Context context;
public SharedHelper(Context context) {
this.context = context;
}
/**
* 保存偏好设定数据
*
* @param userName :账号
* @param userPass : 密码
*/
public void saveUserData(String userName, String userPass) {
/**
* getSharedPreferences(String name, @PreferencesMode int mode)
* name=loginData :偏好设定的文件名,不要写文件格式,SharedPreferences 会自动处理,文件不存在时会自动创建
* Context.MODE_PRIVATE:文件模式,private(私有模式),表示这些偏好设定数据只能本应用使用,或者同一个用户 ID 的应用相互访问
* 此种模式下,如果 key 已经存在,则覆盖,即更新,否则不存在时,则添加
*/
SharedPreferences sharedPreferences = context.getSharedPreferences("loginData", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("userName", userName);
editor.putString("userPass", userPass);
editor.commit();
Toast.makeText(context, "数据写入 SharedPreference", Toast.LENGTH_SHORT).show();
}
/**
* 读取偏好设定数据
*
* @return
*/
public Map<String, String> readUserData() {
Map<String, String> data = new HashMap<>();
/**
* getSharedPreferences(String name, @PreferencesMode int mode)
* name=loginData :偏好设定的文件名,不要写文件格式,SharedPreferences 会自动处理
* Context.MODE_PRIVATE:文件模式,private(私有模式),表示这些偏好设定数据只能本应用使用,或者同一个用户 ID 的应用相互访问
*/
SharedPreferences sharedPreferences = context.getSharedPreferences("loginData", Context.MODE_PRIVATE);
/**
* getString(String key, @Nullable String defValue):取值
* 当值不存在时,默认为空
*/
data.put("userName", sharedPreferences.getString("userName", ""));
data.put("userPass", sharedPreferences.getString("userPass", ""));
return data;
}
}
- 主活动 MainActivity.java 文件内容如下:
package com.lct.www.yuan;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
import com.lct.www.yuan.helper.SharedHelper;
import java.util.Map;
import static android.widget.Toast.LENGTH_SHORT;
public class MainActivity extends AppCompatActivity {
private Context context;
private SharedHelper sharedHelper;
private EditText editTextUserName;
private EditText editTextUserPass;
private Button buttonLogin;
/**
* 活动被创建时触发
*
* @param savedInstanceState
*/
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i("Wmx logs::", "活动创建...");
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
context = getApplicationContext();
sharedHelper = new SharedHelper(context);
bindViews();
}
/**
* 活动为用户可见时触发——读取偏好设定数据进行回显,不存在时显示为空
*/
@Override
protected void onStart() {
Log.i("Wmx logs::", "活动显示...");
super.onStart();
Map<String, String> data = sharedHelper.readUserData();
editTextUserName.setText(data.get("userName"));
editTextUserPass.setText(data.get("userPass"));
}
/**
* 当活动被销毁时触发
*/
@Override
protected void onDestroy() {
Log.i("Wmx logs::", "活动销毁...");
super.onDestroy();
}
/**
* 视图绑定
*/
private void bindViews() {
editTextUserName = findViewById(R.id.userName);
editTextUserPass = findViewById(R.id.userPass);
buttonLogin = findViewById(R.id.buttonLogin);
/**
* 当登录按钮被单击时进入,当 账号 、秘密 不为空时,保存数据
*/
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String userName = editTextUserName.getText().toString();
String userPass = editTextUserPass.getText().toString();
if (userName == null || "".equals(userName)) {
Toast.makeText(context, "账号不能为空", LENGTH_SHORT).show();
return;
}
if (userPass == null || "".equals(userPass)) {
Toast.makeText(context, "秘密不能为空", LENGTH_SHORT).show();
return;
}
sharedHelper.saveUserData(userName, userPass);
}
});
}
}