原标题:Android 从零开始撸一个应用内更新Demo
对于Android app来说,应用内更新几乎成了一个标配的功能了。原理其实不难,今天我们就从零开始撸一个自己的应用内更新的demo出来。
先看看最终实现的效果:
Picture
上图的效果,稍微将功能拆分一下,可以总结为以下几点。
1.检查更新;
2.最新apk下载;
3.apk下载成功后应用内跳转安装;
1.检查更新
为了检验检查更新的效果,我们需要一个tomcat服务器。至于tomcat怎么搭建,这里就不花篇幅去讲了,网上资料还是很多的。
Tomcat部署完成后,在Tomcat ROOT目录上新建一个本次demo的目录,并且将新版的apk文件和一个保存了新版apk相关信息的json文件放在demo目录下。如下图所示:
各位应该已经想到检查更新的原理了,其实就是解析保存了新版apk信息的json文件,然后根据json中新版apk的版本信息来判断当前apk是否有可以更新。
我们这里模拟一个新版apk相关信息的json文件内容。
{ "data":{ "content": "更新内容如下:n 1.xxxxxx;n 2.xxxxxx;n 3.xxxxxx;n", "id": "1", "api_key": "android", "version_code": "2", "version_name": "1.0.2"}, "msg": "获取成功", "status": 1}
可以看到,对于检查更新来说,最重要的几个信息都包含在data字段中,包括了更新内容,新版apk版本号,新版apk版本名称等。当然,根据实际需求,这个json可能会有所不同,具体项目中可以做一些修改,届时解析的时候稍作改动就好了。
接下来完成检查更新相关代码:
/**
* 检查更新
*/
public void checkUpdate(OnCheckUpdateListener onCheckUpdateListener) {
mOnCheckUpdateListener = onCheckUpdateListener;
HttpUtils.sendOkHttpRequest(mUpdateHelper.getNewestApkVersionInfoUrl(), new Callback() {
@Override
public void onFailure(Call call, IOException e) {
ToastUtils.showToast( "check update failed.");
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String strJson = response.body().string();
Log.e( "onResponse", "response.body().string() = "+ strJson);
if(parseJson(strJson).getVersionCode() > AppUtils.getAppVersionCode()) {
sendMessage(MSG_ON_FIND_NEW_VERSION, parseJson(strJson));
} else{
sendMessage(MSG_ON_NEWEST, null);
}
}
});
}
/**
* 解析json数据
*
* @param jsonData json数据
* {
* "data": {
* "content": "更新内容如下:1.xxxxxx;/n 2.xxxxxx;/n 3.xxxxxx;/n",
* "id": "1",
* "api_key": "update test",
* "version_code": "2"
* },
* "msg": "获取成功",
* "status": 1
* }
* @ returndataBean
*/
private DataBean parseJson(String jsonData) {
DataBean dataBean = new DataBean();
try{
JSONObject jsonObject = new JSONObject(jsonData);
JSONObject dataObject = jsonObject.getJSONObject( "data");
dataBean.setContent(dataObject.getString( "content"));
dataBean.setId(dataObject.getInt( "id"));
dataBean.setApiKey(dataObject.getString( "api_key"));
dataBean.setVersionCode(dataObject.getInt( "versi