zoukankan      html  css  js  c++  java
  • Android软件版本更新

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

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

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

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

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

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

    2.1项目目录

                 

    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. }  

    好吧,就这些。希望对你有帮助。
  • 相关阅读:
    eclipse打包
    java reflect 小例子
    linux查看java jdk安装路径和设置环境变量
    mapreduce (一) 物理图解+逻辑图解
    java url 解码 编码 奇怪的解码两次
    cygwin+hadoop+eclipse (三) 运行wordcount实例
    nutch 与 solr 的结合
    一个项目可以有多个源代码路径
    SHAppBarMessage
    记录系统开机启动登录注销等信息
  • 原文地址:https://www.cnblogs.com/new0801/p/6175865.html
Copyright © 2011-2022 走看看