android-sharedPerference

sharedPerference 一般用来 1.配置数据,2.保存数据(一些我们上次点击选择的内容,我们希望在下次应用调起的时候依然有效,无须用户再一次进行配置或选择。Android提供preference这个键值对的方式来处理这种情况)。

1.sharedPerference 用来配置数据的时候我们一般这样获取

public abstractSharedPreferences getSharedPreferences (String name, int mode)方法得到一个sharedpreferences对象,参数name是preference文件的名字,mode则是方式,默认为0。这个方法是在context这个接口里面的一个抽象方法

具体的实现方法是:

//Context类静态数据集合,以键值对保存了所有读取该xml文件后所形成的数据集合

private static final HashMap<File, SharedPreferencesImpl> sSharedPrefs =

new HashMap<File, SharedPreferencesImpl>();

@Override

public SharedPreferences getSharedPreferences(String name, int mode){

//其所对应的SharedPreferencesImpl对象 ,该对象已一个HashMap集合保存了我们对该文件序列化结果

SharedPreferencesImpl sp;

File f = getSharedPrefsFile(name);  //该包下是否存在对应的文件,不存在就新建一个

synchronized (sSharedPrefs) {       //是否已经读取过该文件,是就直接返回该SharedPreferences对象

sp = sSharedPrefs.get(f);

if (sp != null && !sp.hasFileChanged()) {

//Log.i(TAG, "Returning existing prefs " + name + ": " + sp);

return sp;

}

}

//以下为序列化该xml文件,同时将数据写到map集合中

Map map = null;

if (f.exists() && f.canRead()) {

try {

str = new FileInputStream(f);

map = XmlUtils.readMapXml(str);

str.close();

}

...

}

synchronized (sSharedPrefs) {

if (sp != null) {

//Log.i(TAG, "Updating existing prefs " + name + " " + sp + ": " + map);

sp.replace(map);   //更新数据集合

} else {

sp = sSharedPrefs.get(f);

if (sp == null) {

//新建一个SharedPreferencesImpl对象,并且设置其相关属性

sp = new SharedPreferencesImpl(f, mode, map);

sSharedPrefs.put(f, sp);

}

}

return sp;

}

}

我们获取数据的代码如下 是通过 SharedPreferences的实现类SharedPreferencesImpl来操作的

private static final class SharedPreferencesImpl implements SharedPreferences{

private Map mMap;  //保存了该文件序列化结果后的操作, 键值对形式

//通过key值获取对应的value值

public String getString(String key, String defValue) {

synchronized (this) {

String v = (String)mMap.get(key);

return v != null ? v : defValue;

}

}

...

//获得该SharedPreferencesImpl对象对应的Edito类,对数据进行操作

public final class EditorImpl implements Editor {

private final Map<String, Object> mModified = Maps.newHashMap(); //保存了对键值变化的集合

}

}

然后是通过sharedpreferences的editor()方法得到editor对象,之后可以进行相应的编辑操作。

最后通过public abstractSharedPreferences.Editor putString (String key,String value)

执行commit()或是apply()方法,将会应用更改。具体代码如下:

Editor sharedata = getSharedPreferences("data", 0).edit();

sharedata.putString("item","hello getSharedPreferences");

sharedata.commit();

2.sharedPerference 用来保存数据的时候我们一般这样获取

PreferenceManager.getDefaultSharedPreferences(context);这个方法我们要传递一个context对象,

上下文对象我们一般是要操作哪个activity的上下文就穿哪个activity.this就可以了,至于为什么我们看一个UML图就知道了,具体如下:

然后操作数据是和上面一个首先就是获取一个sharedPerference对象然后获取editor然后就可以操作数据了

在具体的项目当中我们可以针对相应需求稍微进行封装,代码具体如下:

public class PreferenceModel {

private SharedPreferences prefs;

private Editor prefsEdit;

private static final PreferenceModel preferenceModel = new PreferenceModel();

private PreferenceModel() {

}

public static PreferenceModel instance(Context context) {

preferenceModel.prefs = PreferenceManager.getDefaultSharedPreferences(context);

return preferenceModel;

}

/**

* 得到所有的properties配置

*

* @return

*/

public Map<String, ?> getAllSystemProperties() {

return prefs.getAll();

}

/**

* 根据key得到properties配置

*/

public Object getSystemProperties(String key, Object defValue, Types type) {

Object curValue = null;

switch (type) {

case BOOLEAN:

curValue = prefs.getBoolean(key, (Boolean) defValue);

break;

case FLOAT:

curValue = prefs.getFloat(key, (Float) defValue);

break;

case INTEGER:

curValue = prefs.getInt(key, (Integer) defValue);

break;

case LONG:

curValue = prefs.getLong(key, (Long) defValue);

break;

case STRING:

curValue = prefs.getString(key, (String) defValue);

break;

}

return curValue;

}

/**

* 保存properties配置

*

* @param key

* @param value

* @param type

*/

public void saveSystemProperties(String key, Object value, Types type) {

if (prefsEdit == null) {

initPrefsEdit();

}

switch (type) {

case BOOLEAN:

prefsEdit.putBoolean(key, (Boolean) value);

break;

case FLOAT:

prefsEdit.putFloat(key, (Float) value);

break;

case INTEGER:

prefsEdit.putInt(key, (Integer) value);

break;

case LONG:

prefsEdit.putLong(key, (Long) value);

break;

case STRING:

prefsEdit.putString(key, (String) value);

break;

}

commitPrefsEdit();

}

/**

* 删除对应key的properties参数配置

*

* @param key

* @param value

*/

public void removeSystemProperties(String key) {

if (prefsEdit == null) {

initPrefsEdit();

}

prefsEdit.remove(key);

commitPrefsEdit();

}

/**

* 获得默认的SharedPreferences对象,此程序内部可读写(内部采用Properties文件形式保存数据)

*

* @return

*/

public SharedPreferences getDefaultSharedPreferences() {

return prefs;

}

/**

* 为减少创建开销,只有当需要保存参数的时候才初始化prefsEdit

*/

private synchronized void initPrefsEdit() {

if (prefsEdit == null) {

prefsEdit = prefs.edit();

}

}

/**

* 保存编辑提交

*/

private void commitPrefsEdit() {

if (prefsEdit != null) {

prefsEdit.commit();

}

}

}

时间: 2024-11-09 05:08:40

android-sharedPerference的相关文章

android app 程序设计思路小结

android app 程序设计思路小结 一.model设计与实现 建立业务POJO,比如user public class User{ private int userId; private String userName; public User(int userId, String userName){ this.userId = userId; this.userName = userName; } public void setUserId(int userId){ this.user

Android开发03

数据储存 已知的数据存储方式 1,文件存储 2,sharedPerference 3,数据库 数据库sqlite: 开源项目,由C实现,嵌入式的数据库,支持事务的数据库ios,windos都是采用的sqlite数据,轻量级的数据库,使用起来很方便 参考文件的创建:创建一个file引用,通过输出流向文件写数据,就会自动创建一个文件(file类中也有专门的方法创建文件,或文件夹) 数据库的创建 1,创建一个帮助类,继承SqLiteOpenHelper 2,自动创建调用父类的有参构造super(con

转载:Android应用的自动更新模块

软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很流行使用Splash界面, 正好与自动更新配套在一起; 在这个自动更新Splash中, 使用到了 动画设置 ,SharedPerference ,pull解析 ,dialog对话框 ,http网络编程 ,handler 等. 注意一个错误 : 已安装具有该名称和不同签名的数据包 , 早上测试人员报告

Android数据存储之File

Android使用与其他平台类似的基于磁盘文件系统(disk-based file systems),上篇文章通过SharedPerference来进行数据存储,这次可以使用File.File 对象非常适合用来读写那种流式顺序的数据,可以用来读写图片文件或者是网络中交换的数据. 存储位置 所有的Android设备都有两个文件存储区域:"internal" 与 "external" 存储. 那两个名称来自与早先的Android系统中,那个时候大多数的设备都内置了不可变

Android成长之路(6)——数据持久化处理

保存key-value对--SharedPreferences 如果有比较小的数据是key-value的关系,这些数据需要储存,那么就可以用到ShardPreferences.一个SharedPreferences对象指向一个包含key-value对的文件,它提供一些简单的方法读和写.每个SharedPreferences文件,可以是私有的也可以是共享的. 注意: SharedPreferences 仅仅可以读和写key-value对,不要跟Preference搞混了. 对 SharedPref

[转]Android应用的自动更新

软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很流行使用Splash界面, 正好与自动更新配套在一起; 在这个自动更新Splash中, 使用到了 动画设置 ,SharedPerference ,pull解析 ,dialog对话框 ,http网络编程 ,handler 等. 注意一个错误 : 已安装具有该名称和不同签名的数据包 , 早上测试人员报告

android开发之onCreate( )方法详解

onCreate( )方法是android应用程序中最常见的方法之一,那么,我们在使用onCreate()方法的时候应该注意哪些问题呢? 先看看Google Android Developers官网上的解释: onCreate(Bundle) is where you initialize your activity. Most importantly, here you will usually call setContentView(int) with a layout resource d

如何用 Android Studio 导入开源项目以及常见错误的解决办法

声明:这篇文章完全来自这篇文章,感谢大神的相助.这篇文章纯粹是为了备份. 本篇以Github上最热门的MaterialDesign库,MaterialDesignLibrary来介绍怎样使用Android Sudio导入开源项目的,如果你和我一样刚刚从Eclipse转到AS,那本篇文章非常适合你. 如果不引入任何第三方库,不做自动化分渠道打包等操作,那可以在完全不了解Gradle的情况下进行Android项目的开发.但如果要想导入Github上的热门项目,必须首先熟悉Gradle. 1. Gra

Android——调用高德地图API前期准备

1.登陆高德开放平台注册账号http://lbs.amap.com/ 2.创建自己的应用并且添加新key 获取发布版安全码获取方法: 在AndroidStudio的Terminal中编译: 输入如下图: 开发版安全码获取: 开发版获取的另一种方法:(和获取发布版本一样在AndroidStudio的Terminal中编译 只是keystore的路径改成debug.keystore    密钥库口令默认是android) 创建key成功 得到key: 前期准备完成 下一篇文章是开发配置 备忘 ,也希

Android小例子:使用反射机制来读取图片制作一个图片浏览器

效果图: 工程文件夹: 该例子可供于新手参考练习,如果有哪里不对的地方,望指正>-< <黑幕下的人> java代码(MainActivity.java): package com.example.imageswitchtest; import java.lang.reflect.Field; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.v