简介
上一篇我们介绍了在android里如何读写本地文件。我们有一种场景,类似网页的cookie,要把用户的一些储如上一次登录、使用的痕迹等信息保存下来以便于每次不需要做重复“填表单”的操作,当在这种场景下我们如果也使用本地文件读写的话显然是“太重”了。因此android提供了一种轻量级存储叫SharedPreference专门用来存储这种场景下的数据。
SharedPreference原理
比如下面这样的一个登录界面,我们把用户登录成功后的信息保存在SharedPreference中,这样用户下次打开手机那么相应的登录过的信息就可以直接自动填充就可以了。这种场景我们就是使用的SharedPreference来做存储的。
SharedPreference的存储
SharedPreference一旦生成后,我们使用Android Studio里的device file explorer
我们可以在data\data\应用实例全package路径里的\shared_prefs文件夹下可以看到我们生成的shared preference的.xml文件。
打开这个文件我们看到了什么?
后端代码
SharedPreferenceHelper.java
package org.mk.android.demo;
import android.content.Context;
import android.content.SharedPreferences;
import android.widget.Toast;
import java.util.HashMap;
import java.util.Map;
public class SharedPreferenceHelper {
private final static String SP_TAG="demosp";
private Context mContext;
public SharedPreferenceHelper() {
}
public SharedPreferenceHelper(Context mContext) {
this.mContext = mContext;
}
//定义一个保存数据的方法
public void save(String loginId, String password) {
SharedPreferences sp = mContext.getSharedPreferences(SP_TAG, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("loginId", loginId);
editor.putString("password", password);
editor.commit();
Toast.makeText(mContext, "信息已写入SharedPreference["+SP_TAG+"]中", Toast.LENGTH_SHORT).show();
}
//定义一个读取SP文件的方法
public Map<String, String> read() {
Map<String, String> data = new HashMap<String, String>();
SharedPreferences sp = mContext.getSharedPreferences(SP_TAG, Context.MODE_PRIVATE);
data.put("loginId", sp.getString("loginId", ""));
data.put("password", sp.getString("password", ""));
return data;
}
}
HomePage.java
package org.mk.android.demo;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import java.util.Map;
public class HomePage extends AppCompatActivity {
private SharedPreferenceHelper spHelper;
private Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home_page);
Button buttonBack=(Button)findViewById(R.id.buttonBack);
buttonBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
finish();
}
});
}
@Override
protected void onStart() {
super.onStart();
ctx = getApplicationContext();
spHelper = new SharedPreferenceHelper(ctx);
Map<String, String> data = spHelper.read();
Toast.makeText(ctx, "从SharedPreference中读到信息LoginId->" + data.get("loginId") + " password->" + data.get("password"), Toast.LENGTH_SHORT).show();
}
}
MainActivity.java
package org.mk.android.demo;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;
import java.util.Map;
public class MainActivity extends AppCompatActivity {
private EditText editLoginId;
private EditText editPassword;
private Button buttonLogin;
private String strLoginId;
private String strPassword;
private SharedPreferenceHelper spHelper;
private Context ctx;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ctx = getApplicationContext();
spHelper = new SharedPreferenceHelper(ctx);
bindView();
}
private void bindView(){
editLoginId = (EditText)findViewById(R.id.editLoginid);
editPassword = (EditText)findViewById(R.id.editPassword);
buttonLogin = (Button)findViewById(R.id.buttonLogin);
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
strLoginId=editLoginId.getText().toString();
strPassword=editPassword.getText().toString();
spHelper.save(strLoginId,strPassword);
Intent homeIt = new Intent(MainActivity.this, HomePage.class);
startActivity(homeIt);
}
});
}
@Override
protected void onStart() {
super.onStart();
ctx = getApplicationContext();
spHelper = new SharedPreferenceHelper(ctx);
Map<String, String> data = spHelper.read();
Toast.makeText(ctx, "从SharedPreference中读到信息LoginId->" + data.get("loginId") + " password->" + data.get("password"), Toast.LENGTH_SHORT).show();
}
}
核心代码导读:
- 当我们点击了登录按钮后,我们把当前用户的登录信息通过SharedPreferenceHelper保存进demo_sp.xml这个SharedPreference文件中去;
- 当我们每次切换到activity_main主界面时,在onStart中触发读取上次保存进SharedPreference中的内容并以Toast显示;
很简单吧,自己动一下手试试吧。