Android应用的更新检测与安装大致步骤就是,从服务器获取应用的版本信息->与当前手机应用版本信息比较->下载最新版本应用->安装
1.从服务器获取应用的版本信息并检测是否更
/*
* 检测是否有新版本,有点话升级
*/
private void checkUpdate() {
new Thread(){
public void run() {
Message msg=Message.obtain();
try {
URL url=new URL(getString(R.string.serverurl));
//联网
try {
HttpsURLConnection conn=(HttpsURLConnection) url.openConnection();
//设置请求方法
conn.setRequestMethod("GET");
//设置联网超时时间为4秒
conn.setConnectTimeout(4000);
int code=conn.getResponseCode();
if(code==200){
//联网成功
InputStream is=conn.getInputStream();
//将流转换成数据串
String result=StreamTools.readFromStream(is);
try {
JSONObject obj=new JSONObject(result);
//获取服务器版本信息
String version=obj.getString("version");
String apkurl=obj.getString("apkurl");
String discription=obj.getString("discription");
//校验是否有新版本
if(getVersionName().equals(version)){
//版本一致,没有新版本,进入主页面
mse.what=ENTER_HOME;
}else{
//有新版本,弹出升级对话框
msg.what=SHOW_UPDATE_DIALOG;
}
} catch (JSONException e) {
msg.what=JSON_ERROR;
e.printStackTrace();
}
}
} catch (IOException e) {
msg.what=NETWORK_ERROR;
e.printStackTrace();
}
} catch (MalformedURLException e) {
msg.what=URL_ERROR;
e.printStackTrace();
}finally{
handler.sendMessage(msg);
}
};
}.start();
}
/**
* 获取版本信息
*/
private String getVersionName() {
// 用于管理手机的APK
PackageManager pm = getPackageManager();
try {
//获取功能清单文件
PackageInfo info=pm.getPackageInfo(getPackageName(), 0);
return info.versionName;
} catch (NameNotFoundException e) {
e.printStackTrace();
return "";
}
}
2.对相应事件进行响应
private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SHOW_UPDATE_DIALOG: //显示升级对话框 showUpdateDialog(); break; case ENTER_HOME: //进入主界面 enterHome(); break; case JSON_ERROR: //JSON解析出错 Toast.makeText(getApplicationContext(), "JSON出错", 0).show(); break; case NETWORK_ERROR: //网络异常 Toast.makeText(getApplicationContext(), "网络异常", 0).show(); break; case URL_ERROR: //URL出错 Toast.makeText(getApplicationContext(), "URL出错", 0).show(); break; default: break; } } };
3.新版本的下载与安装
/* * 弹出升级对话框 */ protected void showUpdateDialog() { AlertDialog.Builder builder=new Builder(this); // builder.setCancelable(false); //强制升级 builder.setOnCancelListener(new OnCancelListener() { public void onCancel(DialogInterface dialog) { //进入主页 enterHome(); dialog.dismiss(); } }); builder.setTitle("提示升级"); builder.setMessage(discription); builder.setPositiveButton("立即升级", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { // 下载apk,并安装替换 if(Environment.getExternalStorageState().equals(Environment.MEDIA_REMOVED)){ //sdcard存在 //final,第三方架包 FinalHttp finalhttp=new FinalHttp(); finalhttp.download(apkurl, Environment.getExternalStorageDirectory().getAbsolutePath()+"/mobilesafe2.0", new AjaxCallBack<File>() { @Override public void onFailure(Throwable t, int errorNo, String strMsg) { // 下载失败 t.printStackTrace(); Toast.makeText(getApplicationContext(), "下载失败", 1).show(); super.onFailure(t, errorNo, strMsg); } @Override public void onLoading(long count, long current) { tv_update_info.setVisibility(View.VISIBLE); //显示进度文本 //当前下载百分比 int progress=(int) (current*100/count); tv_update_info.setText("下载进度"+progress+"%"); super.onLoading(count, current); } @Override public void onSuccess(File t) { super.onSuccess(t); installAPK(t); } //安装下载好的Apk private void installAPK(File t) { Intent intent = new Intent(); intent.setAction("android.intent.action.VIEW"); intent.addCategory("android.intent.category.DEFAULT"); intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive"); startActivity(intent); } }); }else { Toast.makeText(getApplicationContext(), "sdcard不存在,请安装再试",0).show(); return; } } }); builder.setNegativeButton("下次再说", new OnClickListener() { public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); enterHome(); //进入主页 } }); builder.show(); }
服务器路径
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="serverurl">http://192.168.1.112:8080/updateinfo.html</string> </resources>