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

来源:互联网 发布:淘宝信用借钱额度 编辑:程序博客网 时间:2024/06/05 20:41

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

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

比如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 blocke.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 blockreturn false;}return false;}

以上就是写入判断代码。


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

/** * 根据指定key获取相应的配置文件Stringvalue * @param context * @param key */public static String getStringValueBySpecifiedKeyInConfigSp(Context context, String key){String value ;SharedPreferencessp = 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();}}

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

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


原创粉丝点击