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

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

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

比如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();
		}
	}

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

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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值