1、传统的保存用户名,密码方式 SharedPreferences
Editor editor = shareReference.edit(); editor.putString(KEY_NAME,"username_value");
通过这样的方法,能够基本满足需求,比如有用户名,那么就Editor.putString存放就好。
但是这样的方法有一些弊端:
(1)在存放一些集合信息,存储ArrayList就不合适
(2)如果针对用户,新增加了很多熟悉,比如性别,头像等信息,那么需要一个一个的添加put和get方法,非常的繁琐。
2、通过序列化对象,将对象序列化成base64编码的文本,然后再通过SharedPreferences 保存,那么就方便很多,只需要在对象里增加get和set方法就好。
3、 序列换通用方法, 将list对象或者普通的对象序列化成字符串
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 <E> String list2String(List<E> list) throws IOException{ //实例化一个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 <E> List<E> string2List(String str) throws StreamCorruptedException,IOException{ byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT); ByteArrayInputStream bais = new ByteArrayInputStream(mByte); ObjectInputStream ois = new ObjectInputStream(bais); List<E> stringList = null; try { stringList = (List<E>) ois.readObject(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return stringList; } }
4、 要保存的用户对象
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 ,实现对对象的读取和保存
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代码
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; } }
对应的布局文件
<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:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" tools:context=".ActivityMain" > <EditText android:id="@+id/name" android:hint="please input name" android:layout_width="fill_parent" android:layout_height="40dip" /> <EditText android:id="@+id/pwd" android:layout_width="fill_parent" android:hint="please input password" android:layout_height="40dip" /> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="40dip" android:text="保存" > </Button> <Button android:id="@+id/btn_del" android:layout_width="wrap_content" android:layout_height="40dip" android:text="清除" > </Button> </LinearLayout>
来个截图
7、 如果我们的应用程序有不太复杂的保存需求,那么就可借助 SerializableUtil list2String 将list对象保存为文本,然后在通过文本的方式来读取,这样就不用使用数据库了,会轻量很多。