1、传统的保存用户名,密码方式 SharedPreferences

  1. Editor editor = shareReference.edit();
  2. editor.putString(KEY_NAME,"username_value");

  

通过这样的方法,能够基本满足需求,比如有用户名,那么就Editor.putString存放就好。

但是这样的方法有一些弊端:

(1)在存放一些集合信息,存储ArrayList就不合适

(2)如果针对用户,新增加了很多熟悉,比如性别,头像等信息,那么需要一个一个的添加put和get方法,非常的繁琐。

2、通过序列化对象,将对象序列化成base64编码的文本,然后再通过SharedPreferences 保存,那么就方便很多,只需要在对象里增加get和set方法就好。

3、 序列换通用方法, 将list对象或者普通的对象序列化成字符串

  1. package com.example.imagedemo;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.IOException;
  6. import java.io.ObjectInputStream;
  7. import java.io.ObjectOutputStream;
  8. import java.io.StreamCorruptedException;
  9. import java.util.List;
  10.  
  11. import android.util.Base64;
  12.  
  13. public class SerializableUtil {
  14.  
  15. public static <E> String list2String(List<E> list) throws IOException{
  16. //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
  17. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  18. //然后将得到的字符数据装载到ObjectOutputStream
  19. ObjectOutputStream oos = new ObjectOutputStream(baos);
  20. //writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
  21. oos.writeObject(list);
  22. //最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
  23. String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
  24. //关闭oos
  25. oos.close();
  26. return listString;
  27. }
  28.  
  29. public static String obj2Str(Object obj)throws IOException
  30. {
  31. if(obj == null) {
  32. return "";
  33. }
  34. //实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件
  35. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  36. //然后将得到的字符数据装载到ObjectOutputStream
  37. ObjectOutputStream oos = new ObjectOutputStream(baos);
  38. //writeObject 方法负责写入特定类的对象的状态,以便相应的readObject可以还原它
  39. oos.writeObject(obj);
  40. //最后,用Base64.encode将字节文件转换成Base64编码,并以String形式保存
  41. String listString = new String(Base64.encode(baos.toByteArray(),Base64.DEFAULT));
  42. //关闭oos
  43. oos.close();
  44. return listString;
  45. }
  46.  
  47. //将序列化的数据还原成Object
  48. public static Object str2Obj(String str) throws StreamCorruptedException,IOException{
  49. byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
  50. ByteArrayInputStream bais = new ByteArrayInputStream(mByte);
  51. ObjectInputStream ois = new ObjectInputStream(bais);
  52.  
  53. try {
  54. return ois.readObject();
  55. } catch (ClassNotFoundException e) {
  56. // TODO Auto-generated catch block
  57. e.printStackTrace();
  58. }
  59. return null;
  60.  
  61. }
  62.  
  63. public static <E> List<E> string2List(String str) throws StreamCorruptedException,IOException{
  64. byte[] mByte = Base64.decode(str.getBytes(),Base64.DEFAULT);
  65. ByteArrayInputStream bais = new ByteArrayInputStream(mByte);
  66. ObjectInputStream ois = new ObjectInputStream(bais);
  67. List<E> stringList = null;
  68. try {
  69. stringList = (List<E>) ois.readObject();
  70. } catch (ClassNotFoundException e) {
  71. // TODO Auto-generated catch block
  72. e.printStackTrace();
  73. }
  74. return stringList;
  75. }
  76.  
  77. }

4、 要保存的用户对象

  1. package com.example.imagedemo;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import android.annotation.SuppressLint;
  6.  
  7. public class UserEntity implements Serializable
  8. {
  9. private static final long serialVersionUID = -5683263669918171030L;
  10.  
  11. private String userName;
  12. // 原始密码
  13.  
  14. public String getUserName()
  15. {
  16. return userName;
  17. }
  18.  
  19. public void setUserName(String userName)
  20. {
  21. this.userName = userName;
  22. }
  23.  
  24. public String getPassword()
  25. {
  26. return password;
  27. }
  28.  
  29. public void setPassword(String password)
  30. {
  31. this.password = password;
  32. }
  33.  
  34. private String password;
  35.  
  36. }

  

5、编写SharedPreUtil ,实现对对象的读取和保存

  1. package com.example.imagedemo;
  2.  
  3. import java.io.IOException;
  4. import java.io.StreamCorruptedException;
  5.  
  6. import android.content.Context;
  7. import android.content.Intent;
  8. import android.content.SharedPreferences;
  9. import android.content.SharedPreferences.Editor;
  10.  
  11. public class SharedPreUtil
  12. {
  13.  
  14. // 用户名key
  15. public final static String KEY_NAME = "KEY_NAME";
  16.  
  17. public final static String KEY_LEVEL = "KEY_LEVEL";
  18.  
  19. private static SharedPreUtil s_SharedPreUtil;
  20.  
  21. private static UserEntity s_User = null;
  22.  
  23. private SharedPreferences msp;
  24.  
  25. // 初始化,一般在应用启动之后就要初始化
  26. public static synchronized void initSharedPreference(Context context)
  27. {
  28. if (s_SharedPreUtil == null)
  29. {
  30. s_SharedPreUtil = new SharedPreUtil(context);
  31. }
  32. }
  33.  
  34. /**
  35. * 获取唯一的instance
  36. *
  37. * @return
  38. */
  39. public static synchronized SharedPreUtil getInstance()
  40. {
  41. return s_SharedPreUtil;
  42. }
  43.  
  44. public SharedPreUtil(Context context)
  45. {
  46. msp = context.getSharedPreferences("SharedPreUtil",
  47. Context.MODE_PRIVATE | Context.MODE_APPEND);
  48. }
  49.  
  50. public SharedPreferences getSharedPref()
  51. {
  52. return msp;
  53. }
  54.  
  55. public synchronized void putUser(UserEntity user)
  56. {
  57.  
  58. Editor editor = msp.edit();
  59.  
  60. String str="";
  61. try {
  62. str = SerializableUtil.obj2Str(user);
  63. } catch (IOException e) {
  64. // TODO Auto-generated catch block
  65. e.printStackTrace();
  66. }
  67. editor.putString(KEY_NAME,str);
  68. editor.commit();
  69.  
  70. s_User = user;
  71. }
  72.  
  73. public synchronized UserEntity getUser()
  74. {
  75.  
  76. if (s_User == null)
  77. {
  78. s_User = new UserEntity();
  79.  
  80. //获取序列化的数据
  81. String str = msp.getString(SharedPreUtil.KEY_NAME, "");
  82.  
  83. try {
  84. Object obj = SerializableUtil.str2Obj(str);
  85. if(obj != null){
  86. s_User = (UserEntity)obj;
  87. }
  88.  
  89. } catch (StreamCorruptedException e) {
  90. // TODO Auto-generated catch block
  91. e.printStackTrace();
  92. } catch (IOException e) {
  93. // TODO Auto-generated catch block
  94. e.printStackTrace();
  95. }
  96. }
  97.  
  98. return s_User;
  99. }
  100.  
  101. public synchronized void DeleteUser()
  102. {
  103. Editor editor = msp.edit();
  104. editor.putString(KEY_NAME,"");
  105.  
  106. editor.commit();
  107. s_User = null;
  108. }
  109.  
  110. }

  

6、 调用Activity代码

  1. package com.example.imagedemo;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.text.TextUtils;
  6. import android.view.Menu;
  7. import android.view.View;
  8. import android.view.View.OnClickListener;
  9. import android.widget.Button;
  10. import android.widget.EditText;
  11.  
  12. public class ActivityMain extends Activity
  13. {
  14.  
  15. EditText edit_pwd;
  16. EditText edit_name;
  17. Button button;
  18.  
  19. @Override
  20. protected void onCreate(Bundle savedInstanceState)
  21. {
  22. super.onCreate(savedInstanceState);
  23. setContentView(R.layout.activity_main);
  24.  
  25. SharedPreUtil.initSharedPreference(getApplicationContext());
  26.  
  27. edit_pwd = (EditText)findViewById(R.id.pwd);
  28. edit_name = (EditText)findViewById(R.id.name);
  29.  
  30. button = (Button)findViewById(R.id.btn);
  31.  
  32. //保存到本地
  33. button.setOnClickListener(new OnClickListener()
  34. {
  35.  
  36. @Override
  37. public void onClick(View v)
  38. {
  39.  
  40. String name = edit_name.getText().toString();
  41. String pwd = edit_pwd.getText().toString();
  42.  
  43. UserEntity user = new UserEntity();
  44. user.setPassword(pwd);
  45. user.setUserName(name);
  46.  
  47. //用户名,密码保存在SharedPreferences
  48. SharedPreUtil.getInstance().putUser(user);
  49. }
  50. });
  51. Button delBtn = (Button)findViewById(R.id.btn_del);
  52. delBtn.setOnClickListener(new OnClickListener()
  53. {
  54.  
  55. @Override
  56. public void onClick(View v)
  57. {
  58. SharedPreUtil.getInstance().DeleteUser();
  59. edit_name.setText("");
  60. edit_pwd.setText("");
  61. }
  62. });
  63.  
  64. UserEntity user = SharedPreUtil.getInstance().getUser();
  65. if(!TextUtils.isEmpty(user.getPassword()) && !TextUtils.isEmpty( user.getUserName() ) ){
  66. edit_name.setText(user.getUserName());
  67. edit_pwd.setText(user.getPassword());
  68. }
  69.  
  70. }
  71.  
  72. @Override
  73. public boolean onCreateOptionsMenu(Menu menu)
  74. {
  75. // Inflate the menu; this adds items to the action bar if it is present.
  76. getMenuInflater().inflate(R.menu.activity_main, menu);
  77. return true;
  78. }
  79.  
  80. }

  

对应的布局文件

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:paddingBottom="@dimen/activity_vertical_margin"
  6. android:paddingLeft="@dimen/activity_horizontal_margin"
  7. android:paddingRight="@dimen/activity_horizontal_margin"
  8. android:paddingTop="@dimen/activity_vertical_margin"
  9. android:orientation="vertical"
  10. tools:context=".ActivityMain" >
  11.  
  12. <EditText
  13. android:id="@+id/name"
  14. android:hint="please input name"
  15. android:layout_width="fill_parent"
  16. android:layout_height="40dip" />
  17.  
  18. <EditText
  19. android:id="@+id/pwd"
  20. android:layout_width="fill_parent"
  21. android:hint="please input password"
  22. android:layout_height="40dip" />
  23.  
  24. <Button
  25. android:id="@+id/btn"
  26. android:layout_width="wrap_content"
  27. android:layout_height="40dip"
  28. android:text="保存" >
  29. </Button>
  30.  
  31. <Button
  32. android:id="@+id/btn_del"
  33. android:layout_width="wrap_content"
  34. android:layout_height="40dip"
  35. android:text="清除" >
  36. </Button>
  37.  
  38. </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. `cocos2dx非完整`开篇

    相信每个人都有一些自己的项目开发习惯,在·开篇·中我主要是会提到一些项目的配置问题.无论做一款什么样的手游项目,我们总是会从需求的角度出发去选择开发引擎,开发工具等一些列的工具去完善我们的开发环境.当 ...

  2. 爬虫技术 -- 基础学习(四)HtmlParser基本认识

    利用爬虫技术获取网页源代码后,针对网页抽取出它的特定文本内容,利用正则表达式和抽取工具,能够更好地抽取这些内容. 下面介绍一种抽取工具 -- HtmlParser HtmlParser是一个用来解析H ...

  3. 云计算之路-阿里云上:消灭“黑色n秒”第二招——给w3wp进程指定CPU核

    虽然昨天的第一招失败了,但是从失败中我们学到了与多核CPU相关的Processor Affinity(处理器关联)的知识. 既然我们可以让.NET程序的不同线程运行于指定的CPU核,那是不是也可以让I ...

  4. iOS-图片轮播-SDCycleSCrollView的使用

    介绍: SDCycleScrollView 是一款非常强大的轮播图第三方. 轮播流畅,手滑流畅.使用方便.自定义简单. 可以更改pageControl. 一. Demo地址 https://pan.b ...

  5. nodejs morgan包

    新建app.js var express = require('express') var logger = require('morgan') var app = express() app.use ...

  6. 从IE6到IE11上运行WebGL 3D遇到的各种坑

    这篇<基于HTML5的电信网管3D机房监控应用>基于WebGL技术的应用让少同学对HTML5 3D的应用产生了兴趣和信心,但有不少网友私信询问WebGL如何运行在老的IE678910浏览器 ...

  7. SQL SERVER2008及以上版本数据库自动备份的三种方法

    方法一:创建一个维护计划对数据库进行备份 方法二:创建一个SQL作业对数据库进行备份 方法三:创建WINDOWS任务计划对数据库进行备份 方法一与方法二其实原理基本相同,都必需开启SQL代理服务,都会 ...

  8. zabbix配fpmmm(mpm)数据传送不了问题解决

    我们环境用zabbix mpm来监控mysql,不过最近官网已经不叫mpm了,而是叫fpmmm,理由为: fpmmm is the successor of mpm. mpm was renamed ...

  9. mysql修改definer方法

    -- 函数.存储过程 select definer from mysql.proc; update mysql.proc set definer='billing@%';   -- 定时事件 sele ...

  10. SCRUM项目 4.0

    4.0----------------------------------------------- 1.准备看板. 形式参考图4. 2.任务认领,并把认领人标注在看板上的任务标签上. 先由个人主动领 ...