Android软件版本更新

 转的:适合新手学习,但在实际项目中不可这么做。
以下是我转的内容:
===================================================================

各种平台软件更新做法差不多,大体做法如下:

1.服务器存放一个最新版本的xml文件,或者存在数据库,各种做法都可以。

1.1xml文件存储verCode verName updateUrl等信息

1.2用户安装的软件的verCode和服务器上取得的做比较,检测到版本低就更新

2.下面是Android手机软件版本更新的教程

2.1项目目录

             Android软件版本更新

2.2编写UpdateManager类

  1. package com.doublejun.update;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileOutputStream;  
  5. import java.io.IOException;  
  6. import java.io.InputStream;  
  7. import java.net.HttpURLConnection;  
  8. import java.net.MalformedURLException;  
  9. import java.net.URL;  
  10.   
  11. import android.app.AlertDialog;  
  12. import android.app.AlertDialog.Builder;  
  13. import android.app.Dialog;  
  14. import android.content.Context;  
  15. import android.content.DialogInterface;  
  16. import android.content.Intent;  
  17. import android.content.DialogInterface.OnClickListener;  
  18. import android.content.IntentFilter;  
  19. import android.net.Uri;  
  20. import android.os.Handler;  
  21. import android.os.Message;  
  22. import android.util.Log;  
  23. import android.view.LayoutInflater;  
  24. import android.view.View;  
  25. import android.widget.ProgressBar;  
  26.   
  27. public class UpdateManager {  
  28.     private Context mContext;  
  29.     private final String updateMsg = "亲,有新版本,快下载吧!";            //下载消息提示  
  30.     private Dialog noticeDialog;                                        //下载提示对话框  
  31.     private Dialog downloadDialog;                                      //下载进度对话框  
  32.     private ProgressBar mProgressBar;                                   //进度条  
  33.     private Boolean interceptFlag = false;                              //标记用户是否在下载过程中取消下载  
  34.     private Thread downloadApkThread = null;                            //下载线程  
  35.     private final String apkUrl = "http://www.ypdm.com/hyjj.apk";       //apk的URL地址  
  36.     private final String savePath = "/sdcard/UpdateDemo/";              //下载的apk存放的路径  
  37.     private final String saveFileName = savePath + "hyjjrelease.apk";   //下载的apk文件  
  38.     private int progress = 0;                                           //下载进度  
  39.     private final int DOWNLOAD_ING = 1;                                 //标记正在下载  
  40.     private final int DOWNLOAD_OVER = 2;                                //标记下载完成  
  41.     private final String TAG="版本更新";                                    //日志打印标签  
  42.     private Handler mhandler = new Handler() {                          //更新UI的handler  
  43.   
  44.         @Override  
  45.         public void handleMessage(Message msg) {  
  46.             super.handleMessage(msg);  
  47.             switch (msg.what) {  
  48.             case DOWNLOAD_ING:  
  49.                 // 更新进度条  
  50.                 mProgressBar.setProgress(progress);  
  51.                 break;  
  52.             case DOWNLOAD_OVER:  
  53.                 downloadDialog.dismiss();  
  54.                 installApk();  
  55.                 //安装  
  56.                 break;  
  57.             default:  
  58.                 break;  
  59.             }  
  60.         }  
  61.   
  62.     };  
  63.       
  64.     /* 
  65.      * 构造方法 
  66.      */  
  67.     public UpdateManager(Context context) {  
  68.         this.mContext = context;  
  69.     }  
  70.   
  71.     /* 
  72.      * 检查是否有需要更新,具体比较版本xml 
  73.      */  
  74.     public void checkUpdate() {  
  75.         // 到服务器检查软件是否有新版本  
  76.         //如果有则  
  77.         showNoticeDialog();  
  78.     }  
  79.   
  80.     /* 
  81.      * 显示版本更新对话框 
  82.      */  
  83.     private void showNoticeDialog() {  
  84.         AlertDialog.Builder builder = new Builder(mContext);  
  85.         builder.setTitle("版本更新");  
  86.         builder.setMessage(updateMsg);  
  87.         builder.setPositiveButton("更新"new OnClickListener() {  
  88.   
  89.             public void onClick(DialogInterface dialog, int which) {  
  90.                 noticeDialog.dismiss();  
  91.                 showDownloadDialog();  
  92.             }  
  93.         });  
  94.         builder.setNegativeButton("以后再说"new OnClickListener() {  
  95.   
  96.             public void onClick(DialogInterface dialog, int which) {  
  97.                 noticeDialog.dismiss();  
  98.             }  
  99.         });  
  100.         noticeDialog = builder.create();  
  101.         noticeDialog.show();  
  102.   
  103.     }  
  104.   
  105.     /* 
  106.      * 弹出下载进度对话框 
  107.      */  
  108.     private void showDownloadDialog() {  
  109.         AlertDialog.Builder builder = new Builder(mContext);  
  110.         builder.setTitle("软件更新");  
  111.         final LayoutInflater inflater = LayoutInflater.from(mContext);  
  112.         View v = inflater.inflate(R.layout.progress, null);  
  113.         mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);  
  114.         builder.setView(v);  
  115.         builder.setNegativeButton("取消"new OnClickListener() {  
  116.   
  117.             public void onClick(DialogInterface dialog, int which) {  
  118.                 downloadDialog.dismiss();  
  119.                 interceptFlag = true;  
  120.             }  
  121.         });  
  122.         downloadDialog = builder.create();  
  123.         downloadDialog.show();  
  124.         downloadLatestVersionApk();  
  125.   
  126.     }  
  127.       
  128.     /* 
  129.      * 下载最新的apk文件 
  130.      */  
  131.     private void downloadLatestVersionApk() {  
  132.         downloadApkThread = new Thread(downloadApkRunnable);  
  133.         downloadApkThread.start();  
  134.     }  
  135.       
  136.     //匿名内部类,apk文件下载线程  
  137.     private Runnable downloadApkRunnable = new Runnable() {  
  138.   
  139.         public void run() {  
  140.             try {  
  141.                 URL url = new URL(apkUrl);  
  142.                 HttpURLConnection conn = (HttpURLConnection) url  
  143.                         .openConnection();  
  144.                 conn.connect();  
  145.                 int length = conn.getContentLength();  
  146.                 Log.e(TAG, "总字节数:"+length);  
  147.                 InputStream is = conn.getInputStream();  
  148.                 File file = new File(savePath);  
  149.                 if (!file.exists()) {  
  150.                     file.mkdir();  
  151.                 }  
  152.                 File apkFile = new File(saveFileName);  
  153.                 FileOutputStream out = new FileOutputStream(apkFile);  
  154.                 int count = 0;  
  155.                 int readnum = 0;  
  156.                 byte[] buffer = new byte[1024];  
  157.                 do {  
  158.                     readnum = is.read(buffer);  
  159.                     count += readnum;  
  160.                     progress = (int) (((float) count / length) * 100);  
  161.                     Log.e(TAG, "下载进度"+progress);  
  162.                     mhandler.sendEmptyMessage(DOWNLOAD_ING);  
  163.                     if (readnum <= 0) {  
  164.                         // 下载结束  
  165.                         mhandler.sendEmptyMessage(DOWNLOAD_OVER);  
  166.                         break;  
  167.                     }  
  168.                     out.write(buffer,0,readnum);  
  169.                 } while (!interceptFlag);  
  170.                 is.close();  
  171.                 out.close();  
  172.             } catch (MalformedURLException e) {  
  173.                 e.printStackTrace();  
  174.             } catch (IOException e) {  
  175.                 e.printStackTrace();  
  176.             }  
  177.   
  178.         }  
  179.     };  
  180.     /* 
  181.      * 安装下载的apk文件 
  182.      */  
  183.     private void installApk() {  
  184.         File file= new File(saveFileName);  
  185.         if(!file.exists()){  
  186.             return;  
  187.         }  
  188.         Intent intent= new Intent(Intent.ACTION_VIEW);  
  189.         intent.setDataAndType(Uri.parse("file://"+file.toString()), "application/vnd.android.package-archive");  
  190.         mContext.startActivity(intent);  
  191.     }  
  192. }  

以上代码注释足够详细。不解释了。。

2.3在Main中调用试试吧。

  1. package com.doublejun.update;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5.   
  6. public class Main extends Activity {  
  7.     /** Called when the activity is first created. */  
  8.     @Override  
  9.     public void onCreate(Bundle savedInstanceState) {  
  10.         super.onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.         UpdateManager update = new UpdateManager(this);  
  13.         update.checkUpdate();  
  14.     }  
  15. }  

好吧,就这些。希望对你有帮助。
上一篇:【Spring Boot 快速入门】十、Spring Boot集成Druid数据监控


下一篇:CSS中常见的长度单位