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>