app的检查更新已经很常见了,这里说一下思路。
进入首页,或者你的欢迎页面的时候去请求服务器版本,和本地版本做比较,如果不一致,就开启一起线程去下载。下载完提示用户安装,当然,你也可以提示用户是否下载。
思路比较简单。我把代码放到一个工具类里面了,首先说一下哈,我比较菜,所以代码有很多的不规范的地方,希望大佬提出来,我会改的。
首先,请求服务器,获得版本信息主要是获得code值。
myverCode = 0;//服务器版本号
myvername = "";//版本version值
urlapk = "";//apk的url
create_time = "";
//获取服务器最新版本信息
OkHttpUtils
.post()
.url(DataUrl.GET_VERSION)
.addParams("type", "1")//type=dajiqi
.build()
.execute(new StringCallback() {
@Override
public void onError(Call call, Exception e, int id) {
ToastUtils.showSimpleToast(context, "网络异常");
}
@Override
public void onResponse(String response, int id) {
Log.e("版本json:", "+response:" + response);
try {
JSONObject jsonObject = new JSONObject(response);
if ("1".equals(jsonObject.getString("error_code"))) {
myverCode = Integer.valueOf(jsonObject.getJSONObject("data").getString("number"));
myvername = jsonObject.getJSONObject("data").getString("version");
urlapk = jsonObject.getJSONObject("data").getString("url");
create_time = jsonObject.getJSONObject("data").getString("create_time");
JudgementVersion();
} else {
Log.e("版本信息", "请求服务器版本失败");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
获取完服务器的版本信息就可以拿服务器版本code和本地的code值比较
//判断当前版本和服务器版本,解决是否更新
private void JudgementVersion() {
if (myverCode > getVerCode()) {
showDownloadDialog();
} else {
Log.e("版本信息:", "当前版本为最新版本");
}
}
这里是是否显示进度条对话框 以及是否给dialog的取消按钮。我做的比较恶习,是直接不提示的。
/**
* 显示进度条对话框
*/
public void showDownloadDialog() {
// AlertDialog.Builder dialog = new AlertDialog.Builder(context);
// dialog.setTitle("正在更新");
// final LayoutInflater inflater = LayoutInflater.from(context);
// View v = inflater.inflate(R.layout.softupdate_progress, null);
// mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
// dialog.setView(v);
// //如果是强制更新,则不显示取消按钮
// if (forceUpdate == false) {
// dialog.setNegativeButton("取消", new DialogInterface.OnClickListener() {
// @Override
// public void onClick(DialogInterface arg0, int arg1) {
// // TODO Auto-generated method stub
// arg0.dismiss();
// cancelFlag = false;
// }
// });
// }
// alertDialog2 = dialog.create();
// alertDialog2.setCancelable(false);
// alertDialog2.show();
//下载apk
downloadAPK();
}
开启一个子线程去下载,同时子线程和主线程同时传递消息,更新进度条的进度,这段代码比较简单,就不贴了,
下面是获得本地的版本号代码
private int getVerCode() {
int verCode = -1;
try {
verCode = context.getPackageManager().getPackageInfo("com.mabiwang", 0).versionCode;
} catch (Exception e) {
PrintUtil.logI(ConstUtil.LOG_CALLHH, "获取App版本号称Exception msg: " + e.getMessage());
}
Log.e("verCode:", "verCode:" + verCode);
return verCode;
}
接下来只要打开apk就可以了。
/**
* 下载完成后自动安装apk
*/
public void installAPK() {
File apkFile = new File(saveFileName);
if (!apkFile.exists()) {
return;
}
Intent localIntent = new Intent(Intent.ACTION_VIEW);
localIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
localIntent.setDataAndType(Uri.parse("file://" + apkFile.toString()), "application/vnd.android.package-archive");
context.startActivity(localIntent);
}
但是这里有个小坑,在7.0以上,因为权限的原因,如果直接这样写,会报一个错误,我也忘记掉是什么了,大家可以试一下,这里直接贴出解决办法。在你的myapplication的oncreate里面加上下面代码。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
StrictMode.setVmPolicy(builder.build());
}
到这里就完了,完整的工具类我上传了,我还写了一个智能安装,类似于qq浏览器,一些应用商城,点击安装就直接自动安装的,是通过模拟用户手指点击实现的一个服务,下次在写一篇,写的不是很好,希望大家提出宝贵的意见。
http://download.csdn.net/detail/qq_35969487/9879186