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. TortoiseGit+msysgit保存用户名和密码

    本文以windows系统为例 保存用户名和密码 在C盘的c:\Users**qing** (或可能是C:\Users\Administrator) (替换自己的用户名)找到.gitconfig, 如果 ...

  7. cookie保存用户名及密码

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

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

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

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

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

随机推荐

  1. toad 常用快捷键与配置

    F8 调出以前执行的sql命令 F9 执行全部sql Ctrl+. 补全table_name Ctrl+t 补全table_name,或者显示字段 alt+ 箭头上下 看sql history Ctr ...

  2. 【C语言】汉诺塔问题

    之前遇见这个问题,非常费劲地理解了,并写出代码,然后过段时间,再遇见这个问题,又卡住了,如此反反复复两三次,才发现自己对递归的理解依然很肤浅.今天无聊,重温<算法:c语言实现>一书,又遇见 ...

  3. Maven Android使用一

    Maven的坐标包括:groupId.artifactId.version.packaging.classifier. groupId:定义当前maven项目隶属的实际项目: artifactId:定 ...

  4. 无插件纯web 3D机房 (第四季:大型园区、地球仪效果和其他扩展应用)

    前言 初次见面的朋友们大家好,这篇文章是"无插件纯web 3D机房"系列的第四季,感兴趣的朋友可从头开始观看,以下是正确的阅读顺序: 无插件纯web 3D机房(第一季:从零开始搭建 ...

  5. Ubuntu 12.10

    上海交通大学更新服务器(教育网千兆接入,联通/电信线路情况不详),包含其他开源镜像: deb http://ftp.sjtu.edu.cn/ubuntu/ quantal main multivers ...

  6. 从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器

    先看一下效果图: 实现功能:点击不同的色块可以改变文字的颜色. 实现步骤: 一.创建一个默认的Qt Quick工程: 二.添加文件Cell.qml 这一步主要是为了实现一个自定义的组件,这个组件就是我 ...

  7. DDD:两篇不错的文章

    文章列表 Coding for Domain-Driven Design: Tips for Data-Focused Devs. Strengthening your domain: Aggrega ...

  8. [转载]基于MVC4+EasyUI的Web开发框架经验总结(8)--实现Office文档的预览

    在博客园很多文章里面,曾经有一些介绍Office文档预览查看操作的,有些通过转为PDF进行查看,有些通过把它转换为Flash进行查看,但是过程都是曲线救国,真正能够简洁方便的实现Office文档的预览 ...

  9. HQueue:基于HBase的消息队列

    HQueue:基于HBase的消息队列   凌柏   ​1. HQueue简介 HQueue是一淘搜索网页抓取离线系统团队基于HBase开发的一套分布式.持久化消息队列.它利用HTable存储消息数据 ...

  10. SCRUM:第一天任务实现情况

    我认领了我们团队“广商百货”应用平台的密码提示功能,任务暂时还在进行中.虽然建立了数据库,但是数据库里要存放什么数据,我们的小组还在讨论中.因为android的知识还在自学过程中,所以做起来比较慢,也 ...