写在前面的话
1、主要参考自:https://b23.tv/Xqlo6e
2、内容如果有不对的,希望可以指出或补充。
3、新知识。
一、概述
SharedPreferences(共享参数):是Android系统
提供的一个轻量级的存储类,适用于存储数量较少的场合(如存取一些长期保存到手机客户端信息,用户个性化设置的字体等参数信息)。以键值对(值只能是int、long、boolean、String和float基本的数据类型)的方式存储在一个XML文件中(文件存放目录:/data/data/应用程序包名/shared_prefs/*.xml),存储在内存。
应用程序卸载后,文件也会被删除。
二、使用
文件名不存在就会创建一个,操作模式有两种:
- Context.MODE_PRIVATE(或0):【默认操作模式】,直接在把第二个参数写0就是默认使用这种操作模式,代表该文件是私有数据,只能被应用本身访问,写入的内容会覆盖原文件的内容
- Context.MODE_MULTI_PRIVATE(或32768):用于多个进程共同操作一个SharedPreferences文件,检查该文件名对应的文件存在就在其中追加内容,否则创建新文件。
注:MODE_WORLD_READABLE(或1)[当前文件可以被其他应用读取]和MODE_WORLD_WRITEABLE(或2)[当前文件可以被其他应用写入] 这两种模式已经在【Android4.2版本以后】废弃了。
(一)存储数据
// 1、通过调用内置函数(Context对象的)getSharedPreferences创建对象:可以被同一应用程序下的其他组件共享
//另:调用Activity对象的getPreferences()方法:获得的SharedPreferences对象只能在该Activity中使用,会自动将当前类名作为文件名,只需要传入操作模式即可
SharedPreferences sp = getSharedPreferences(文件名,操作模式);
//2、获取SharedPreferences的编辑器,调用edit()方法
//使文件处于可编辑状态
SharedPreferences.Editor editor = sp.edit();
//3、调用编辑器的putXXX(String key,xxx value)方法存入数据
//将数据放于编辑器中
editor.putString(String key, String value);
//4、提交存入的值
//也可用editor.commit();方法
editor.apply();
//补充:editor.clear();-----》清除数据
【两种提交方式区别】
- apply (): 异步处理。会先写入内存,然后异步写入磁盘。推荐使用这个。
- commit(): 有返回值。直接写入磁盘。仅当需要立刻确定提交结果,并据此做相应的其他操作时,推荐用。
(二)读取数据
// 1、通过调用内置函数(Context对象的)getSharedPreferences创建对象
SharedPreferences sp = getSharedPreferences(文件名,操作模式);
//2、调用编辑器的getXXX(String key,xxx default)方法读取数据
sp.getString(String key, String default);
三、测试
在【安卓基础练习 02 |登录注册】的基础上进行的。
功能:勾选记住用户和密码复选框后,再次进入app就会自动写入用户名和密码。
布局
实现代码
在LoginActivity.java文件中:
package com.example.tasktwo;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
public class LoginActivity extends AppCompatActivity {
//声明控件变量
private EditText edtName, edtPwd;
private Button btnLogin, btnCancel;
private CheckBox testSharedPreferences;
/**
* 新添部分-SharedPreferences
*/
private SharedPreferences sp; // 声明共享参数
private SharedPreferences.Editor editor; // 声明编辑器
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//加载登录布局页面
setContentView(R.layout.login_activity);
//获取相应控件
edtName = findViewById(R.id.edt_username);
edtPwd = findViewById(R.id.edt_password);
btnLogin = findViewById(R.id.btn_login);
btnCancel = findViewById(R.id.btn_cancel_login);
testSharedPreferences = findViewById(R.id.test_sharedpreferences);//获取控件
/** 在onCreate()方法外声明SharedPreferences、SharedPreferences.Editor的全局变量
* 新添部分-SharedPreferences
* 公共部分
*/
sp = getSharedPreferences("data",0);//1步
/**
* 读取数据的实现
*/
edtName.setText(sp.getString("name",""));//2步
edtPwd.setText(sp.getString("pwd",""));
/**
*======================================
*/
///登录事件
btnLogin.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
String name = edtName.getText().toString().trim();
String pwd = edtPwd.getText().toString().trim();
if(name.equals("admin") && pwd.equals("admin")){
// Toast.LENGTH_SHORT大概显示时间为1秒,Toast.LENGTH_LONG大概显示时间为3秒
Toast.makeText(LoginActivity.this,"恭喜,用户名与密码正确!",
Toast.LENGTH_SHORT).show();
/**
* 新添部分-SharedPreferences
* 判断是否勾选了记住用户名和密码
* 存储数据的实现
*/
if(testSharedPreferences != null){
editor = sp.edit();//2步
editor.putString("name",name);//3步
editor.putString("pwd",pwd);
editor.apply();//4步
}
/**
*======================================
*/
Intent intent_l = new Intent(LoginActivity.this,LoginMessage.class);
//封装数据
Bundle usrData =new Bundle();
usrData.putString("l_name",name);
//携带数据包
intent_l.putExtras(usrData);
//启动目标组件
startActivity(intent_l);
}else{
Toast.makeText(LoginActivity.this,"遗憾,用户名或密码错误!请重新输入",
Toast.LENGTH_SHORT).show();
}
}
});
//取消事件,也就是关闭当前界面
btnCancel.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
finish();
}
});
}
}
查看文件中存储的数据
效果