天天看點

Android軟體版本更新

 轉的:适合新手學習,但在實際項目中不可這麼做。

以下是我轉的内容:

===================================================================

各種平台軟體更新做法差不多,大體做法如下:

1.伺服器存放一個最新版本的xml檔案,或者存在資料庫,各種做法都可以。

1.1xml檔案存儲verCode verName updateUrl等資訊

1.2使用者安裝的軟體的verCode和伺服器上取得的做比較,檢測到版本低就更新

2.下面是Android手機軟體版本更新的教程

2.1項目目錄

Android軟體版本更新

2.2編寫UpdateManager類

package com.doublejun.update;  

import java.io.File;  

import java.io.FileOutputStream;  

import java.io.IOException;  

import java.io.InputStream;  

import java.net.HttpURLConnection;  

import java.net.MalformedURLException;  

import java.net.URL;  

import android.app.AlertDialog;  

import android.app.AlertDialog.Builder;  

import android.app.Dialog;  

import android.content.Context;  

import android.content.DialogInterface;  

import android.content.Intent;  

import android.content.DialogInterface.OnClickListener;  

import android.content.IntentFilter;  

import android.net.Uri;  

import android.os.Handler;  

import android.os.Message;  

import android.util.Log;  

import android.view.LayoutInflater;  

import android.view.View;  

import android.widget.ProgressBar;  

public class UpdateManager {  

    private Context mContext;  

    private final String updateMsg = "親,有新版本,快下載下傳吧!";            //下載下傳消息提示  

    private Dialog noticeDialog;                                        //下載下傳提示對話框  

    private Dialog downloadDialog;                                      //下載下傳進度對話框  

    private ProgressBar mProgressBar;                                   //進度條  

    private Boolean interceptFlag = false;                              //标記使用者是否在下載下傳過程中取消下載下傳  

    private Thread downloadApkThread = null;                            //下載下傳線程  

    private final String apkUrl = "http://www.ypdm.com/hyjj.apk";       //apk的URL位址  

    private final String savePath = "/sdcard/UpdateDemo/";              //下載下傳的apk存放的路徑  

    private final String saveFileName = savePath + "hyjjrelease.apk";   //下載下傳的apk檔案  

    private int progress = 0;                                           //下載下傳進度  

    private final int DOWNLOAD_ING = 1;                                 //标記正在下載下傳  

    private final int DOWNLOAD_OVER = 2;                                //标記下載下傳完成  

    private final String TAG="版本更新";                                    //日志列印标簽  

    private Handler mhandler = new Handler() {                          //更新UI的handler  

        @Override  

        public void handleMessage(Message msg) {  

            super.handleMessage(msg);  

            switch (msg.what) {  

            case DOWNLOAD_ING:  

                // 更新進度條  

                mProgressBar.setProgress(progress);  

                break;  

            case DOWNLOAD_OVER:  

                downloadDialog.dismiss();  

                installApk();  

                //安裝  

            default:  

            }  

        }  

    };  

    /* 

     * 構造方法 

     */  

    public UpdateManager(Context context) {  

        this.mContext = context;  

    }  

     * 檢查是否有需要更新,具體比較版本xml 

    public void checkUpdate() {  

        // 到伺服器檢查軟體是否有新版本  

        //如果有則  

        showNoticeDialog();  

     * 顯示版本更新對話框 

    private void showNoticeDialog() {  

        AlertDialog.Builder builder = new Builder(mContext);  

        builder.setTitle("版本更新");  

        builder.setMessage(updateMsg);  

        builder.setPositiveButton("更新", new OnClickListener() {  

            public void onClick(DialogInterface dialog, int which) {  

                noticeDialog.dismiss();  

                showDownloadDialog();  

        });  

        builder.setNegativeButton("以後再說", new OnClickListener() {  

        noticeDialog = builder.create();  

        noticeDialog.show();  

     * 彈出下載下傳進度對話框 

    private void showDownloadDialog() {  

        builder.setTitle("軟體更新");  

        final LayoutInflater inflater = LayoutInflater.from(mContext);  

        View v = inflater.inflate(R.layout.progress, null);  

        mProgressBar = (ProgressBar) v.findViewById(R.id.updateProgress);  

        builder.setView(v);  

        builder.setNegativeButton("取消", new OnClickListener() {  

                interceptFlag = true;  

        downloadDialog = builder.create();  

        downloadDialog.show();  

        downloadLatestVersionApk();  

     * 下載下傳最新的apk檔案 

    private void downloadLatestVersionApk() {  

        downloadApkThread = new Thread(downloadApkRunnable);  

        downloadApkThread.start();  

    //匿名内部類,apk檔案下載下傳線程  

    private Runnable downloadApkRunnable = new Runnable() {  

        public void run() {  

            try {  

                URL url = new URL(apkUrl);  

                HttpURLConnection conn = (HttpURLConnection) url  

                        .openConnection();  

                conn.connect();  

                int length = conn.getContentLength();  

                Log.e(TAG, "總位元組數:"+length);  

                InputStream is = conn.getInputStream();  

                File file = new File(savePath);  

                if (!file.exists()) {  

                    file.mkdir();  

                }  

                File apkFile = new File(saveFileName);  

                FileOutputStream out = new FileOutputStream(apkFile);  

                int count = 0;  

                int readnum = 0;  

                byte[] buffer = new byte[1024];  

                do {  

                    readnum = is.read(buffer);  

                    count += readnum;  

                    progress = (int) (((float) count / length) * 100);  

                    Log.e(TAG, "下載下傳進度"+progress);  

                    mhandler.sendEmptyMessage(DOWNLOAD_ING);  

                    if (readnum <= 0) {  

                        // 下載下傳結束  

                        mhandler.sendEmptyMessage(DOWNLOAD_OVER);  

                        break;  

                    }  

                    out.write(buffer,0,readnum);  

                } while (!interceptFlag);  

                is.close();  

                out.close();  

            } catch (MalformedURLException e) {  

                e.printStackTrace();  

            } catch (IOException e) {  

     * 安裝下載下傳的apk檔案 

    private void installApk() {  

        File file= new File(saveFileName);  

        if(!file.exists()){  

            return;  

        Intent intent= new Intent(Intent.ACTION_VIEW);  

        intent.setDataAndType(Uri.parse("file://"+file.toString()), "application/vnd.android.package-archive");  

        mContext.startActivity(intent);  

}  

以上代碼注釋足夠詳細。不解釋了。。

2.3在Main中調用試試吧。

import android.app.Activity;  

import android.os.Bundle;  

public class Main extends Activity {  

    /** Called when the activity is first created. */  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

        super.onCreate(savedInstanceState);  

        setContentView(R.layout.main);  

        UpdateManager update = new UpdateManager(this);  

        update.checkUpdate();  

好吧,就這些。希望對你有幫助。