android應用檢測更新

序言:

在android開發過程中,我們不可能將一個應用開發到完美才上線(估計永遠也無法上線了),所以,我們有版本的更新迭代,放眼安卓應用商店,每一個應用都會有很多個版本,在應用上線並且用戶下載安裝之後,如果你的應用有新的版本的話,你不可能讓每一個用戶都重新到應用商店中下載新的版本,所以,我們需要讓我們的應用自己檢測有沒有新的版本。


1. 首先,每一個應用在發佈的時候都應該有一個版本,而這個版本需要你自己配置,在android manifest這個文件中,你得指定你應用當前的版本:

<manifest xmlns:android="http://schemas.android.com/apk/res/android

    package="com.jiagj.guanjia"
    android:versionCode="1"
    android:versionName="1.0>
    <application></application>
</manifest>

上面我們看到,表示版本的有兩個東西versionCode和VersionName,第一個是一個整數值,表示你的應用更新了多少次,初始值爲1,以後每更新一次,該值相應的加1;versionName是你的應用的版本號,這個是String類型的,從1.0開始,然後每次更新你可以指定爲新的版本值,可以是1.01、1.02、2.10等等。

2. 然後我們要從服務器拿到這個版本號,也就是versionName,或者是versionCode來和當前你正在使用的應用的版本號進行比較,通過比較可以得知有沒有新版本的應用:

從服務器獲得版本號通過接口可以獲得,獲取當前應用的版本如下:

 /**
 * 獲取版本號
 *
 * @return 當前應用的版本號
 */
public static String getVersion() {
    try {
        PackageManager manager = RzApplication.getInstance().getPackageManager();
        PackageInfo info = manager.getPackageInfo(RzApplication.getInstance().getPackageName(), 0);
        String version = info.versionName;
        return version;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}
3. 然後就是下載更新和安裝新的apk了,獲取新版本的時候,新版本的apk下載地址也需要獲取過來,方便我們下載並安裝

下載需要在子線程中進行,所以需要新開一個下載文件的線程:

private Handler mHandler = new Handler() {
    public void handleMessage(Message msg) {
        switch (msg.what) {
            // 正在下載
            case DOWNLOAD:
                // 設置進度條位置
                mProgress.setProgress(progress);
                break;
            case DOWNLOAD_FINISH:
                // 安裝文件
                installApk();
                break;
            default:
                break;
        }
    }
};

/**
 * 顯示軟件下載對話框
 */
private void showDownloadDialog() {
    // 構造軟件下載對話框
    AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
    builder.setTitle("正在更新");
    // 給下載對話框增加進度條
    final LayoutInflater inflater = LayoutInflater.from(mContext);
    View v = inflater.inflate(R.layout.softupdate_progress, null);
    mProgress = (ProgressBar) v.findViewById(R.id.update_progress);
    builder.setView(v);
    // 取消更新
    builder.setNegativeButton("取消更新", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            dialog.dismiss();
            // 設置取消狀態
            cancelUpdate = true;
        }
    });
    mDownloadDialog = builder.create();
    mDownloadDialog.show();
    // 現在文件
    downloadApk();
}

 /**
 * 下載apk文件
 */
private void downloadApk() {
    // 啓動新線程下載軟件
    new downloadApkThread().start();
}

/**
 * 下載文件線程
 */
class downloadApkThread extends Thread {
    @Override
    public void run() {
        try {
            // 判斷SD卡是否存在,並且是否具有讀寫權限
            if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
                // 獲得存儲卡的路徑
                String sdpath = Environment.getExternalStorageDirectory() + "/";
                mSavePath = sdpath + "download";
                URL url = new URL("新版本apk的url");
                // 創建連接
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.connect();
                // 獲取文件大小
                int length = conn.getContentLength();
                // 創建輸入流
                InputStream is = conn.getInputStream();

                File file = new File(mSavePath);
                // 判斷文件目錄是否存在
                if (!file.exists()) {
                    file.mkdir();
                }
                File apkFile = new File(mSavePath, "新版本apk的名稱");
                FileOutputStream fos = new FileOutputStream(apkFile);
                int count = 0;
                // 緩存
                byte buf[] = new byte[1024];
                // 寫入到文件中
                do {
                    int numread = is.read(buf);
                    count += numread;
                    // 計算進度條位置
                    progress = (int) (((float) count / length) * 100);
                    // 更新進度
                    mHandler.sendEmptyMessage(DOWNLOAD);
                    if (numread <= 0) {
                        // 下載完成
                        mHandler.sendEmptyMessage(DOWNLOAD_FINISH);
                        break;
                    }
                    // 寫入文件
                    fos.write(buf, 0, numread);
                } while (!cancelUpdate);// 點擊取消就停止下載.
                fos.close();
                is.close();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 取消下載對話框顯示
        mDownloadDialog.dismiss();
    }
}

/**
 * 安裝APK文件
 */
private void installApk() {
    File apkfile = new File(mSavePath, versionInfo.getName());
    if (!apkfile.exists()) {
        return;
    }
    // 通過Intent安裝APK文件
    Intent intent = new Intent(Intent.ACTION_VIEW);
    intent.setDataAndType(Uri.parse("file://" + apkfile.toString()), "application/vnd.android.package-archive");
    mContext.startActivity(intent);
}

上面的代碼比較多,我們按照步驟來看:

首先,定義了一個handler來更新下載的狀態(正在下載,和下載完成),正在下載的時候通過handler來更新進度條中進度值,下載完成之後,調用安裝apk的方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章