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>
?