1、传统的保存用户名,密码方式 SharedPreferences
1
2
|
Editor editor = shareReference.edit();
editor.putString(KEY_NAME,
"username_value"
);
|
通过这样的方法,能够基本满足需求,比如有用户名,那么就Editor.putString存放就好。
但是这样的方法有一些弊端:
(1)在存放一些集合信息,存储ArrayList就不合适
(2)如果针对用户,新增加了很多熟悉,比如性别,头像等信息,那么需要一个一个的添加put和get方法,非常的繁琐。
2、通过序列化对象,将对象序列化成base64编码的文本,然后再通过SharedPreferences 保存,那么就方便很多,只需要在对象里增加get和set方法就好。
3、 序列换通用方法, 将list对象或者普通的对象序列化成字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package com.example.imagedemo;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.List;
import android.util.Base64;
public
class
SerializableUtil {
public
static
//实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
ByteArrayOutputStream baos =
new
ByteArrayOutputStream();
//然后将得到的字符数据装载到ObjectOutputStream
ObjectOutputStream oos =
new
ObjectOutputStream(baos);
//writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
oos.writeObject(list);
//最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
String listString =
new
String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
//关闭oos
oos.close();
return
listString;
}
public
static
String obj2Str(Object obj)throws IOException
{
if
(obj ==
null
) {
return
""
;
}
//实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
ByteArrayOutputStream baos =
new
ByteArrayOutputStream();
//然后将得到的字符数据装载到ObjectOutputStream
ObjectOutputStream oos =
new
ObjectOutputStream(baos);
//writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
oos.writeObject(obj);
//最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
String listString =
new
String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
//关闭oos
oos.close();
return
listString;
}
//将序列化的数据还原成Object
public
static
Object str2Obj(String str) throws StreamCorruptedException,IOException{
byte
[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
ByteArrayInputStream bais =
new
ByteArrayInputStream(mByte);
ObjectInputStream ois =
new
ObjectInputStream(bais);
try
{
return
ois.readObject();
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return
null
;
}
public
static
byte
[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
ByteArrayInputStream bais =
new
ByteArrayInputStream(mByte);
ObjectInputStream ois =
new
ObjectInputStream(bais);
List
null
;
try
{
stringList = (List
}
catch
(ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return
stringList;
}
}
|
4、 要保存的用户对象
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
package com.example.imagedemo;
import java.io.Serializable;
import android.annotation.SuppressLint;
public
class
UserEntity implements Serializable
{
private
static
final
long
serialVersionUID = -5683263669918171030L;
private
String userName;
// 原始密码
public
String getUserName()
{
return
userName;
}
public
void
setUserName(String userName)
{
this
.userName = userName;
}
public
String getPassword()
{
return
password;
}
public
void
setPassword(String password)
{
this
.password = password;
}
private
String password;
}
|
5、编写SharedPreUtil ,实现对对象的读取和保存
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
package com.example.imagedemo;
import java.io.IOException;
import java.io.StreamCorruptedException;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
public
class
SharedPreUtil
{
// 用户名key
public
final
static
String KEY_NAME =
"KEY_NAME"
;
public
final
static
String KEY_LEVEL =
"KEY_LEVEL"
;
private
static
SharedPreUtil s_SharedPreUtil;
private
static
UserEntity s_User =
null
;
private
SharedPreferences msp;
// 初始化,一般在应用启动之后就要初始化
public
static
synchronized
void
initSharedPreference(Context context)
{
if
(s_SharedPreUtil ==
null
)
{
s_SharedPreUtil =
new
SharedPreUtil(context);
}
}
/**
* 获取唯一的instance
*
* @return
*/
public
static
synchronized SharedPreUtil getInstance()
{
return
s_SharedPreUtil;
}
public
SharedPreUtil(Context context)
{
msp = context.getSharedPreferences(
"SharedPreUtil"
,
Context.MODE_PRIVATE | Context.MODE_APPEND);
}
public
SharedPreferences getSharedPref()
{
return
msp;
}
public
synchronized
void
putUser(UserEntity user)
{
Editor editor = msp.edit();
String str=
""
;
try
{
str = SerializableUtil.obj2Str(user);
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
editor.putString(KEY_NAME,str);
editor.commit();
s_User = user;
}
public
synchronized UserEntity getUser()
{
if
(s_User ==
null
)
{
s_User =
new
UserEntity();
//获取序列化的数据
String str = msp.getString(SharedPreUtil.KEY_NAME,
""
);
try
{
Object obj = SerializableUtil.str2Obj(str);
if
(obj !=
null
){
s_User = (UserEntity)obj;
}
}
catch
(StreamCorruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return
s_User;
}
public
synchronized
void
DeleteUser()
{
Editor editor = msp.edit();
editor.putString(KEY_NAME,
""
);
editor.commit();
s_User =
null
;
}
}
|
6、 调用Activity代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
package com.example.imagedemo;
import android.app.Activity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
public
class
ActivityMain extends Activity
{
EditText edit_pwd;
EditText edit_name;
Button button;
@Override
protected
void
onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
SharedPreUtil.initSharedPreference(getApplicationContext());
edit_pwd = (EditText)findViewById(R.id.pwd);
edit_name = (EditText)findViewById(R.id.name);
button = (Button)findViewById(R.id.btn);
//保存到本地
button.setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
String name = edit_name.getText().toString();
String pwd = edit_pwd.getText().toString();
UserEntity user =
new
UserEntity();
user.setPassword(pwd);
user.setUserName(name);
//用户名,密码保存在SharedPreferences
SharedPreUtil.getInstance().putUser(user);
}
});
Button delBtn = (Button)findViewById(R.id.btn_del);
delBtn.setOnClickListener(
new
OnClickListener()
{
@Override
public
void
onClick(View v)
{
SharedPreUtil.getInstance().DeleteUser();
edit_name.setText(
""
);
edit_pwd.setText(
""
);
}
});
UserEntity user = SharedPreUtil.getInstance().getUser();
if
(!TextUtils.isEmpty(user.getPassword()) && !TextUtils.isEmpty( user.getUserName() ) ){
edit_name.setText(user.getUserName());
edit_pwd.setText(user.getPassword());
}
}
@Override
public
boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return
true
;
}
}
|