Android中SharedPreferences和Properties的一些组合使用

原创 2012年03月22日 13:12:33

最近空闲下来,公司的整个产品客户端基本已经进入稳定的商业化运行。

后期要处理的是跟合作伙伴的版本控制。

比如A,B,C三个合作伙伴,在应用上,整个模型基本是不变的,可能只是改变下几个传递参数或是应用本身的设置参数;

当然,这个还是比较简单,可能说你每个应用打包前修改下某个写死的商户版本号。

后来又提出一个比较蛋疼的需求,就是我们应用的首页或是某个界面中的显示顺序要能做到控制。

这就比较坑爹了,理论上来说列表显示控制其实也是比较简单的,即我所有的信息都是从服务端获取,完成对于顺序等等的控制,

完全是可以放在服务端完成的。

但是这又要考虑到一个问题,也是一个需求,就是如果在没有网络的情况下,那我没有返回的信息,界面不就是空白了?

解决的话:1.可以考虑缓存,没有网络情况下我读取最后一次保存的内容。但是,我们的产品首页信息是针对实时性操作的的,而不是那种

新闻类应用,对于用户的操作其实没有影响的。

2.设置一套默认界面配置。即,在没有网络的情况下,对于没有填充内容的返回,至少,我们可以显示指定的图片以及提示的文字显示。

那这套配置信息我们就可以写在一个配置文件里,在应用安装时写入偏好,(在对于为什么要写入偏好,当然是为了考虑应用下次读取参数速率。)


以下是根据我们应用自身需求我实现的简单设想。

step1:在assets文件下建立一个properties文件,写入配置版本号(因为我们的应用涉及到列表显示排序问题,这个排序对于客户端来说,

在应用打完包后,那就是写死了的,那后期真的需要更改排序了,比如热门列表上下变动了,那我只能通过服务端来控制了。),

这个版本号的功能是在应用启动时去服务端获取最新的配置文件(即,服务端也有相应这样一个版本号,相同则返回一个标志值,不同则返回最新的配置。)

step2:在app启动时,判断后将properties文件写入到SharedPreferences中,此刻又会考虑到一个问题:我不能每次应用启动都写入吧,

这样的操作也是不合理的,即我们需要一个标志位来判断配置文件是否已经被写入过(即,配置文件只需在应用安装时写入一次即可)。

那么就设置一个configstatus来判断呗。

这时,又会引来一个问题,如果我应用升级了,因为据我所知,现在你应用升级覆盖后,偏好文件貌似都是在的,即不清楚卸载掉,

那么带在新版本中的配置文件就因为判断configstatus,存在,不会写入。

因此我们在考虑一个标记位,我这边用了应用版本号。每次升级版本号都是变的,那么升级后可以判断properties文件需要重新写入。

private ConfigurationUtils(){
	
		sp = mContext.getSharedPreferences(Constant.CONFIGURATION_FILE_NAME, Constant.CONFIGURATION_FILE_MODE);
		if(!exsitSharedPreferences()){
			LogUtil.log("ConfigurationUtils", "SharedPreferences 未配置,开始配置");
			defaultProperty = new Properties();
			file2SharedPreferences(defaultProperty,sp);
		}
	
		
	};
	
	static class Holder {
		static ConfigurationUtils instance = new  ConfigurationUtils(); 
	}
	
	public static ConfigurationUtils getInstance(){
		Log.i("ConfigurationUtils", "执行--ConfigurationUtils.Holder.instance");
		return ConfigurationUtils.Holder.instance;
	}
	
	/**
	 * 
	 * @return
	 */
	public static  boolean  exsitSharedPreferences(){
		String currentVerName = "null";
		try {
			 currentVerName= mContext.getPackageManager().
			 getPackageInfo(Constant.packageName, 0).versionName;
		} catch (NameNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return sp.getString("configuratonstatus", "0").equals("0")
		|| !sp.getString("version", "0") .
		equals(currentVerName) ?false:true;
		
	}
	
	
	/**
	 * 将assets中的propties文件配置写入SharedPreferences
	 * @return
	 */
	public static boolean file2SharedPreferences(Properties prop,SharedPreferences preferences){
		try {
			
			sp.edit().clear().commit();
			//载入配置文件
			prop.load(mContext.getAssets().open("jifenka.properties"));	
			Iterator it=prop.entrySet().iterator();
			while(it.hasNext()){
			    Map.Entry entry=(Map.Entry)it.next();
			    String key = (String) entry.getKey();
			    String value = (String) entry.getValue();
			    preferences.edit().putString(key, value).commit();
			}
			preferences.edit().putString("configuratonstatus","1").commit();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			return false;
		}
		
		return false;
		
	}

以上就是写入判断代码。


step3:应用进入首页面后,显示列表额顺序即可以从偏好中获取

/**
	 * 根据指定key获取相应的配置文件Stringvalue
	 * @param context
	 * @param key
	 */
	public static String getStringValueBySpecifiedKeyInConfigSp(Context context, String key){
		String value ;
		SharedPreferences	sp = context.getSharedPreferences(Constant.CONFIGURATION_FILE_NAME, 
				Constant.CONFIGURATION_FILE_MODE);
		
		value = sp.getString(key, "0");
		return value;
	}


基本流程就是这样。

对于如果版本号不同了的话,要更新偏好

	
	/**
	 * 更新或是增加设置配置信息。
	 * @param context
	 * @param infoMap
	 */
	public static void setConfigInfoSp(Context context,
			Map<String, String> infoMap) {
		SharedPreferences sp = context.getSharedPreferences(
				Constant.LOGIN_INFO, Constant.CONFIGURATION_FILE_MODE);
		Set<String> set = infoMap.keySet();
		for (Iterator it = set.iterator(); it.hasNext();) {
			String s = (String) it.next();
			sp.edit().putString(s, infoMap.get(s)).commit();
		}
	}

这样的话就即可以做到服务端控制列表的顺序,一解决了没有网络情况下可以显示默认列表的问题。

而对于我这公司这样的同个应用多版本的情况,配置文件的引入可以更加快速和明了的起控制作用。


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android下properties文件的读写操作

android下properties文件的读写操作,网上大多数是读是成功的,如果要是写数据到文件里面,都会报这样的错误:Caused by: java.io.FileNotFoundException...

Android下用Properties保存程序配置

读写函数分别如下: import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Pro...
  • ameyume
  • ameyume
  • 2010年11月26日 16:29
  • 31118

android:使用Properties保存程序配置

Java.util.PropertiesProperties类是Java操作配置文件类,是JAVA的api,主要用于读取Java的配置文件。 其实各种语言都有自己所支持的配置文件。 配置文件是为了...
  • cch1024
  • cch1024
  • 2016年05月14日 22:02
  • 1187

Android 对 properties文件的读写操作

http://zouhuajian01.blog.163.com/blog/static/11769877201251410467309/

在android程序中使用配置文件properties

项目需求是:程序启动时读取配置文件,启动后在设置里面可以修改配置文件并保存到指定的配置文件里面。而在android程序中使用配置文件来管理一些程序的配置信息其实非常简单 在这里我们主要就是用到Prop...

Android开发笔记(八十四)使用Properties读写属性值

Properties概述 Java中的配置文件常为.properties文件,而Properties类便是读写此类文件的工具。属性文件有两种格式,一种是文本格式,其内容是“键=值”的形式,文本注释信息...
  • aqi00
  • aqi00
  • 2016年03月10日 15:10
  • 2508

Android中读取properties文件

通过流文件来进行properties文件读取的,要将文件放入到assets文件夹或者raw文件夹中.例如,我们这里有一个文件test.properties,如果放入了assets文件夹中,可以如下打开...

Android中读取properties文件

android中properties文件一般放置在assets目录中,在android studio中默认工程没有assets目录,参照下面步骤建立 1: 打开 项目名称.iml 文件. 确保有这...
  • patch
  • patch
  • 2016年06月20日 19:47
  • 511

android properties分析(2) 应用层 properties设置和获取接口分析

命令行 properties设置和获取接口分析 代码在system/core/toolbox/ getprop.c setprop.c 看code,实际就是调用C ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中SharedPreferences和Properties的一些组合使用
举报原因:
原因补充:

(最多只允许输入30个字)