最近空闲下来,公司的整个产品客户端基本已经进入稳定的商业化运行。
后期要处理的是跟合作伙伴的版本控制。
比如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();
}
}
这样的话就即可以做到服务端控制列表的顺序,一解决了没有网络情况下可以显示默认列表的问题。
而对于我这公司这样的同个应用多版本的情况,配置文件的引入可以更加快速和明了的起控制作用。