首页 > 代码库 > android 保存 用户名和密码 设置等应用信息优化

android 保存 用户名和密码 设置等应用信息优化

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对象保存为文本,然后在通过文本的方式来读取,这样就不用使用数据库了,会轻量很多。