1.sharedpreferences的存储和读取
- 概论
Android数据存储使用sharedpreferences(以下简称SP),以键值对的方式存储在xml文件里。文件结构如下:
<map>
<string name="username">18883340065</string>
<string name="password">6b28020697bf708712a824caca5fea5f</string>
</map>
此文件名为自定义,文件存储目录为/data/data/包名/shared_prefs。
- 存储
使用SharedPreferences.Editor 进行存储。代码如下:
SharedPreferences.Editor editor=getSharedPreferences("文件名",模式 ).edit();
editor.putString(键,值);
editor.commist();
- 读取
使用SharedPreferences直接读取。
SharedPreferences pref=getSharedPreferences("文件名",模式);
Sring name=pref.getString(键,默认值);
2.使用SharedPreferences实现用户自动登录
2.1 思路
- 用户注册成功时就将用户名和密码使用SP保存在user.xml中。
- 每次启动APP,先启动WelcomeActivity界面,然后进行判断。
- 如果user.xml中用户名和密码都存在时,就自动登录。如果用户名密码不存在时,就跳转到登录页面。
- 考虑到安全性,存储方式不能直接存明文密码,需要进行加密。于是使用了MD5加密。
2.2 流程
-
具体流程如图:
2.3 代码
- 打开APP的第一个Activity,即WelcomeActivity,做出是否自动登录的判定。无xml视图文件。
public class WelcomeActivity extends AppCompatActivity {
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//获取用户名密码
SharedPreferences pref = getSharedPreferences("user", MODE_PRIVATE);
String username = pref.getString("username", "");
String password = pref.getString("password", "");
//进行判定
Intent intent=new Intent();
if(!username.equals("")&&!password.equals("")){
intent.setClass(this,MainActivity.class);
}else{
intent.setClass(this,LoginActivity.class);
}
this.finish();
startActivity(intent);
}
}
- 登录页面的关键性代码,登陆时读取SP内数据,再将输入的密码进行MD5加密,然后与SP内密码比较,若一样则正常登陆。
public void onClick(View v) {
Intent intent1 = new Intent();
switch (v.getId()) {
case R.id.login:
//取数据
SharedPreferences pref = getSharedPreferences("user", MODE_PRIVATE);
String username = pref.getString("username", "");
String password = pref.getString("password", "");
//对输入的密码进行MD5加密
String passwordGet=MD5Utils.encode(password_tx.getText().toString());
//判定
if (username.equals(username_tx.getText().toString()) && password.equals(passwordGet)) {
intent1.setClass(LoginActivity.this, MainActivity.class);
startActivity(intent1);
}else{
Toast.makeText(this, password, Toast.LENGTH_SHORT).show();
}
break;
case R.id.register:
intent1.setClass(LoginActivity.this, RegisterActivity.class);
startActivity(intent1);
break;
}
}
- 注册页面关键代码,使用java自带的正则表达式进行了对用户名和密码的检测,并且在注册成功后将数据用SP存储。
public void check() {
//正则表达
Pattern pattern_user = Pattern.compile("\\d{11}");
Matcher matcher_user = pattern_user.matcher(username.getText().toString());
boolean user = matcher_user.matches();
Pattern pattern_pass = Pattern.compile("\\w{8}");
Matcher matcher_pass = pattern_pass.matcher(password.getText().toString());
boolean pass = matcher_pass.matches();
//存储数据
if (user && pass) {
SharedPreferences.Editor editor = getSharedPreferences("user", MODE_PRIVATE).edit();
editor.putString("username", username.getText().toString());
password_tx=password.getText().toString();
password_tx=MD5Utils.encode(password_tx);
editor.putString("password", password_tx);
editor.commit();
Toast.makeText(this, password_tx, Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.setClass(RegisterActivity.this, MainActivity.class);
startActivity(intent);
} else if (!user) {
Toast.makeText(this, "请输入正确的手机号码", Toast.LENGTH_SHORT).show();
} else if (!pass) {
Toast.makeText(this, "请输入正确的密码", Toast.LENGTH_SHORT).show();
}
}
- MainActivity代码,拥有一个TextView显示当前用户名,拥有一个Button退出登录跳转到登录页。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtUser=(TextView)findViewById(R.id.txt_user);
SharedPreferences pref = getSharedPreferences("user", MODE_PRIVATE);
String username = pref.getString("username","");
txtUser.setText(username);
btnExit=(Button)findViewById(R.id.btn_exit);
btnExit.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent intent=new Intent();
intent.setClass(MainActivity.this,LoginActivity.class);
startActivity(intent);
}
});
}
- MD5加密类代码,我也看不大懂T_T
package com.luffy.sharedpreferencesdemo;
import java.security.MessageDigest;
public class MD5Utils {
/**
* md5加密的工具类
*
* @param password
* @return
*/
public static String encode(String password) {
try {
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] results = digest.digest(password.getBytes());
StringBuilder sb = new StringBuilder();
for(byte b : results){
int number = b&0xff;
String hex = Integer.toHexString(number);
if(hex.length()==1){
sb.append("0");
}
sb.append(hex);
}
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
}
网友评论