1) 功能:
a) 程序运行时显示的第一个界面,用于展示公司Logo,
b) 校验本地版本信息与服务器版本是否一致
c) 提示用户是否进行版本更新
d) 从服务器下载最新版本apk并安装
2) 实现:
a) 程序开始运行时获取当前版本信息
Context.getpackageManager().getPackageInfo(Context.getPackageName,0).versionName
b) 开启子线程(主线程不能执行耗时操作)访问网络服务器,获取服务器最新版本信息
c) 通过消息返回机制Handle将访问网络的信息返回主线程
d) 版本相同时跳转到主界面(Home),版本不同时弹出更新对话框,出现ERROR时,跳转到主界面,并打印错误信息!
e) 当版本不同时,用户选择暂不更新,跳转到主界面,选择立即更新时,自动访问服务器下载最新版本apk,并调用系统包安装服务进行apk安装.
3) 新增文件信息:
a) Src/Activitys 放置所有activity类
1. HomeActivity 主界面(功能未实现)
2. SplashActivity Splash界面(今日实现改类所有功能)
b) Src/Utils 放置项目开发中所有使用的工具类
1. JsonUtils 二次封装gson.jar 实现json数据的解析
2. PackageInfoUtils 得到软件当前版本信息
3. StreamTools 流的工具类
c) Libs
1. Gson.jar JSON解析框架
2. xUtils 多功能框架包,今日使用访问网络的HttpUtils
d) res/drawable
1. ic_launcher.png 软件图标
2. splash.jpg Splash界面背景
e) res/layout
1. activity_home.xml 主界面的ui
2. activity_splash.xml Splash页面的ui
f) res/values
1.paths 访问网络的路径信息
4) 清单文件
a)添加了访问网络的权限
b)添加了写入SD卡的权限
c)声明Home主界面
d)设置Splash全屏显示
5) 个人总结
a) 软件是支持离线工作的,所以在访问网络获取最新版本信息后,存在三种情况
1.相同或本地版本高于服务器版本,则在Splash界面停留2秒之后,应自动跳转到主界面
2.本低于服务器版本,则需要进行提示,让用户选择是否更新当前版本
3.访问网络,或获取软件版本失败等错误发生时,应跳转到主界面,并以Toast将错误码打印在屏幕上,并提醒用户练习客服解决问题
b) 设置Splash停留两秒
1.在子线程开始访问网络时获取当前系统时间
Long startTime =System.currentTimeMillis();
2.在子线程通过Handler发送消息前,获取网络访问结束的当前系统时间
Long endTime =System.currentTimeMillis();
3.时间在两秒
Long Time = endTime –startTime;
If(Time<2000) {
SystemClock.sleep(2000-Time);
}
c) Gson.jar 解析json数据 需要二次封装(JsonUtils.java)
public class JsonUtils {
/**
* 把一个map变成json字符串
*/
public static StringparseMapToJson(Map<?, ?> map) {
try {
Gsongson = new Gson();
returngson.toJson(map);
} catch(Exception e) {
}
return null;
}
/**
* 把一个json字符串变成对象
*/
public static<T> T parseJsonToBean(String json, Class<T> cls) {
Gson gson =new Gson();
T t = null;
try {
t =gson.fromJson(json, cls);
} catch(Exception e) {
}
return t;
}
/**
* 把json字符串变成map
*/
public staticHashMap<String, Object> parseJsonToMap(String json) {
Gson gson =new Gson();
Type type =new TypeToken<HashMap<String, Object>>() {
}.getType();
HashMap<String,Object> map = null;
try {
map= gson.fromJson(json, type);
} catch(Exception e) {
}
return map;
}
/**
* 把json字符串变成集合
*/
public staticList<?> parseJsonToList(String json, Type type) {
Gson gson =new Gson();
List<?>list = gson.fromJson(json, type);
return list;
}
/**
* 获取json串中某个字段的值,注意,只能获取同一层级的value
*/
public static StringgetFieldValue(String json, String key) {
if(TextUtils.isEmpty(json))
returnnull;
if(!json.contains(key))
return"";
JSONObjectjsonObject = null;
String value= null;
try {
jsonObject= new JSONObject(json);
value= jsonObject.getString(key);
} catch(JSONException e) {
e.printStackTrace();
}
returnvalue;
}
}