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();//然后将得到的字符数据装载到ObjectOutputStreamObjectOutputStream oos = new ObjectOutputStream(baos);//writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它oos.writeObject(list);//最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));//关闭oosoos.close();return listString;}public static  String obj2Str(Object obj)throws IOException{if(obj == null) {return "";}      //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件ByteArrayOutputStream baos = new ByteArrayOutputStream();//然后将得到的字符数据装载到ObjectOutputStreamObjectOutputStream oos = new ObjectOutputStream(baos);//writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它oos.writeObject(obj);//最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));//关闭oosoos.close();return listString;} //将序列化的数据还原成Objectpublic 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 blocke.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 blocke.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{// 用户名keypublic 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 blocke.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 blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.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;@Overrideprotected 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(){@Overridepublic 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());    }    }@Overridepublic 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、 如果我们的应用程序有不太复杂的保存需求,那么就可借助SerializableUtillist2String 将list对象保存为文本,然后在通过文本的方式来读取,这样就不用使用数据库了,会轻量很多。

更多相关文章

  1. Android(安卓)代码分析 私有析构函数
  2. android之退出应用程序
  3. 【Dialer】自定义暗码进入测试模式
  4. Android(安卓)-- 基础
  5. Android(安卓)textview 不使用ScrollView也可滚动的方法
  6. Android之ksoap2-android详解与调用天气预报Webservice完整实例
  7. Android(安卓)四大组件 - 进程的 fork 创建过程
  8. 关于如何获取android状态栏高度
  9. Android(安卓)Okhttp + Android提交post表单乱码问题

随机推荐

  1. Android学习笔记之GridView
  2. Android(安卓)Sensor详解(8)sensor hal层分
  3. 或许您还不知道的八款开源Android游戏引
  4. Android配置心得
  5. android菜单详解三:上下文菜单
  6. 实现基于Android的英文电子词典
  7. 微软与哲学的距离
  8. 真正的高手都在讲故事
  9. pgsql查看主备节点的方法
  10. Python如何开发网站?这两个不能少!