Android数据存储之SharedPreferences及如何安全存储
前言:
最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用。
什么是SharedPreferences存储?
SharedPreferences是基础key-value(键值对)来存储一些轻量数据的存储方式,特别适用于保存软件配置参数。使用SharedPreferences 保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs。
具体是怎么使用的?
1.)写入数据
SharedPreferences sharedPreferences= getSharedPreferences("test",
Activity.MODE_PRIVATE);
//实例化SharedPreferences.Editor对象
SharedPreferences.Editor editor = sharedPreferences.edit();
//用putString的方法保存数据
editor.putBoolean(USER_ISLOGIN,true);
editor.putString(USER_ID, "");
editor.putString(USER_PWD, "pwd123");
//提交当前数据
editor.apply();
2.)读取数据
SharedPreferences sharedPreferences= getSharedPreferences("test",
Activity.MODE_PRIVATE);
String userId=sharedPreferences.getString(USER_ID,"");
String userPwd=sharedPreferences.getString(USER_PWD,"");
boolean isLogin=sharedPreferences.getBoolean(USER_ISLOGIN,false);
Log.e("","userId---->"+userId);
Log.e("","userPwd---->"+userPwd);
Log.e("","isLogin---->"+isLogin);
3.)监听数据变化
SharedPreferences.OnSharedPreferenceChangeListener onSharedPreferenceChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
}
};
sharedPreferences.registerOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//注册数据变化监听
sharedPreferences.unregisterOnSharedPreferenceChangeListener(onSharedPreferenceChangeListener);//解注册数据变化监听
4.)权限控制
SharedPreferences sharedPreferences= getSharedPreferences("test",
Activity.MODE_PRIVATE);
第一个参数是生成xxx.xml文件的文件名字,第二个参数是文件的访问权限以及文件数据写入方式。简单说明一下几种方式:
Activity.MODE_PRIVATE,//默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容
Activity.MODE_WORLD_READABLE,//表示当前文件可以被其他应用读取,
Activity.MODE_WORLD_WRITEABLE,//表示当前文件可以被其他应用写入;
Activity.MODE_APPEND//该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件 可以复合使用例如:
如果希望文件被其他应用读和写,可以传入:Activity.MODE_WORLD_READABLE+Activity.MODE_WORLD_WRITEABLE
5.)看下具体写入文件的存储结构:

看到上面的存储数据那么清晰是不是吓坏了!对!你没有看错!存储在文件中就是这样的,纯明文存储没有一点安全性可言~即使设置了Activity.MODE_PRIVATE权限在ROOT权限面前也是不堪一击的。所以我们在使用SharedPreferences的时候尽量不要存储一些有关用户信息的数据比如本文例子中的userId,userPwd等,如果要存储那该怎么补救的呢?我们可以把key md5一下例如MD5Utils.md5(USER_ID),value 值加密一下,可以采用AES加密 附上一个AndroidAES加密文章(http://www.cnblogs.com/whoislcj/p/5473030.html)。
6.)数据共享探讨
Context otherAppContext = createPackageContext("com.gary.appdisplaycontrol", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sharedPreferences = otherAppContext.getSharedPreferences("preferences",Context.MODE_WORLD_READABLE|Context.MODE_MULTI_PROCESS);
看了下官方api强烈说明这是一个非常危险的操作。
Android数据存储之SharedPreferences及如何安全存储的更多相关文章
- Android数据持久化技术 — — —SharedPreferences
SharedPreferences是使用键值对的方式来存储数据. 要想使用SharedPreferences来存储数据,必须获取SharedPreferences对象,获取SharedPreferen ...
- Android数据储存之SharedPreferences总结
写在前面:本文是我参考李刚老师的<疯狂Android讲义>以及API所写的读书笔记,在此表示感谢,本人小白,如有错误敬请指教. SharedPreferences的使用背景: 有时候,应用 ...
- Android数据储存之SharedPreferences
Android中SharedPreferences通常与Editor连用 接口SharedPreferences常用方法: boolean contains(String str):判断SharedP ...
- Android数据存储方式--SharedPreferences
Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...
- Android数据存储之SharedPreferences存储
安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布 ...
- Android数据存储-通过SharedPreferences实现记住密码的操作
在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...
- Android 数据存储之 SharedPreferences储存
------------------------------------------SharedPreferences存储--------------------------------------- ...
- Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览
Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的. ...
- Android数据存储(一)----SharedPreferences详解
一.Android数据的存储方式: Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File:此外还有一种网络存储 ...
随机推荐
- Python学习笔记(1)
从今天开始正式学习python,教程看的是廖雪峰老师的Python 2.7教程.链接在此:http://www.liaoxuefeng.com/wiki/0014316089557264a6b3489 ...
- Shader实例:NGUI制作网格样式血条
效果: 思路: 1.算出正确的uv去采样过滤图,上一篇文章说的很明白了.Shader实例:NGUI图集中的UISprite正确使用Shader的方法 2.用当前血量占总血量的百分比来设置shader中 ...
- 使用maven搭建ssh框架
首先搭建sturts2框架,配置pom文件: <properties> <!-- 文件拷贝时的编码 --> <project.build.sourceEncoding&g ...
- Salesforce注册开发者账号
在对Salesforce进行了简单的了解之后,我们现在来注册Salesforce的开发者账号,开始Salesforce的学习 一.注册前的准备 首先点击网址:https://developer.sal ...
- linux上安装activeMQ
1.新建一个文件夹activeMQ mkdir /server 2.授权 chmod 777 /server 3.下载activeMQ安装包,拷贝到/activeMQ目录下apache-acti ...
- Unity3d使用高通Vuforia发布IOS工程不支持64位的一些解决办法
1.将Unit升级至4.6.x或5.0.x,将Vuforia差距升级到最新版本(vuforia-unity-mobile-android-ios-4-0-105 ) 2.平台Other Setting ...
- linux时间同步ntp服务的安装与配置
1.首先安装NTP [root@localhost /]# yum install ntp -y 2.修改NTP配置文件,添加NTP服务器的网络位置 /etc/ntp.conf # For mo ...
- 测试函数用Return 返回值和用函数名返回值的区别
'*************************************************************************'**模 块 名:工程1 - Form1'**说 ...
- 另类的表单数据"序列化"
背景:最近在做项目时,由于编辑页面需要提交的数据量有些多,而且在提交前还需要做一些逻辑处理,所以如果按照正常的方式,一个个的获取值然后拼接json对象传到后台的话相对工作量较大,而且容易出错,后期的维 ...
- 推荐学习使用cocoapods和phoneGap安装的链接
phoneGap安装:http://blog.csdn.net/cwb1128/article/details/18019751 cocoaPods使用:http://blog.csdn.net/wz ...