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

android 保存 用户名和密码 设置等应用信息优化的更多相关文章

  1. Android简易实战教程--第十六话《SharedPreferences保存用户名和密码》

    之前在Android简易实战教程--第七话<在内存中存储用户名和密码> 那里是把用户名和密码保存到了内存中,这一篇把用户名和密码保存至SharedPreferences文件.为了引起误导, ...

  2. 终于解决“Git Windows客户端保存用户名与密码”的问题(转载)

    add by zhj:不建议用这种方法,建议用SSH,参见 TortoiseGit密钥的配置 http://www.cnblogs.com/ajianbeyourself/p/3817364.html ...

  3. iOS 使用Keychain 保存 用户名和密码到 本地

    iOS 使用Keychain 保存 用户名和密码到 本地 之前曾把一些简单的数据保存在了plist,文件,及NsuserDefault里面, 但是如果要保存密码之类的,保存在本地就很不安全了: 但是利 ...

  4. git保存用户名和密码

    git保存用户名和密码 简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境 ...

  5. Git Windows客户端保存用户名和密码

    解决Git Windows客户端保存用户名和密码的方法,至于为什么,就不想说了. 1. 添加一个HOME环境变量,值为%USERPROFILE% 2. 开始菜单中,点击“运行”,输入“%Home%”并 ...

  6. cookie保存用户名及密码

    登陆页中,用户输入用户名密码,点击提交,后台对照mysq数据库中,看是否有对应的用户名,以及密码是否正确.如果正确 则将用户名密码分两份Cookie保存.页面跳转到登陆成功页. 用户再次访问登陆页时, ...

  7. Git Windows客户端保存用户名与密码

    1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home%,新建一个名为“_netrc”的文件. 3. 用记事本打开_n ...

  8. 终于解决“Git Windows客户端保存用户名与密码”的问题

    这就是正确答案,我们已经验证过了,下面详细描述一下解决方法: 1. 在Windows中添加一个HOME环境变量,值为%USERPROFILE%,如下图: 2. 在“开始>运行”中打开%Home% ...

  9. tortoiseGit保存用户名和密码

    简介:tortoiseGit(乌龟git)图形化了git,我们用起来很方便,但是我们拉取私有项目的时候,每次都要输入用户名和密码很麻烦,这里向大家介绍怎么避免多少输入 试验环境:window10,安装 ...

随机推荐

  1. Python Day12

    MySQL 数据库介绍 什么是数据库? 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们 ...

  2. Android_SQLite数据库增删改查操作

    一:什么是SQLite? 在Android平台上,集成了一个嵌入式关系型轻量级的数据库. 二:什么时候用的数据库? 有大量相似机构的数据需要存储时. 三:如何创建一个数据库? 1.创建一个Sqlite ...

  3. MongoDB学习笔记~管道中的分组实现group+distinct

    回到目录 mongoDB的管道是个好东西,它可以将很多操作批处理实现,即将多个命令放入一个管道,然后去顺序的执行它们,今天我要说的是,利用管道中的分组来实现实现中的ditinct+group的效果,即 ...

  4. python基础(七)函数

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 函数最重要的目的是方便我们重复使用相同的一段程序. 将一些操作隶属于一个函数,以后 ...

  5. log4j.properties 详解与配置步骤(转)

    找的文章,供参考使用 转自 log4j.properties 详解与配置步骤 一.log4j.properties 的使用详解 1.输出级别的种类 ERROR.WARN.INFO.DEBUGERROR ...

  6. ZooKeeper3.4.6配置

    添加环境变量 #ZooKeeper VARIABLES START export ZOOKEEPER_HOME=/usr/local/zookeeper-3.4.6 export PATH=$PATH ...

  7. Solr数据库连接之多表关联

    Solr环境配置好后,有很多时候我们需要把数据库里的数据添加到索引里,这时就需要配置跟数据库的连接,下面我们看配置的步骤. 1. 配置 solrconfig.xml  (在slor 主目录 core ...

  8. Winform Krypton控件使用(一)

    在学生健康系统中前期考虑需求中,考虑过在C/S下使用Winform或WPF完成项目, 在winform下,考虑过两套插件,一个是DotNetBar, 控件很多,但这个是收费的,考虑到以后的版权和费用问 ...

  9. linux ssh 安装、安全设置

    环境:ubuntu 12.04   一.简单安装设置 1. 安装ssh 服务器 $ sudo apt-get install openssh 2. 查看运行状态 $ service ssh statu ...

  10. SKShapeNode类

    继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/L ...