1. 程式人生 > >Android 實現本地更新並在更新完成後開啟

Android 實現本地更新並在更新完成後開啟

一、 簡介

現在的android應用app會隔一段時間釋出一個新的版本,當你開啟某個app,如果有最新的版本,會提醒你是否下載更新。本文利用android自帶的下載管理器DownloadManager進行下載最新版本的apk,下載完成後自動跳轉安裝。

二、實現

1 Code比較

首先你需要去向伺服器獲取當前最新的版本的VersionCode,與本地的Code比較。通
本地的獲取方法如下:

PackageManager packageManager = this.getPackageManager();
        PackageInfo packageInfo;
        int versionCode = 0
; try { packageInfo = packageManager.getPackageInfo(this.getPackageName(), 0); versionCode = packageInfo.versionCode; } catch (PackageManager.NameNotFoundException e) { e.printStackTrace(); }

2 呼叫DownloadManager

 public static long download(String url) {
        // 建立下載請求
        DownloadManager.Request
request = new DownloadManager.Request(Uri.parse(url)); /* * 設定在通知欄是否顯示下載通知(下載進度), 有 3 個值可選: * VISIBILITY_VISIBLE: 下載過程中可見, 下載完後自動消失 (預設) * VISIBILITY_VISIBLE_NOTIFY_COMPLETED: 下載過程中和下載完成後均可見 * VISIBILITY_HIDDEN: 始終不顯示通知 */
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // 設定通知的標題和描述 request.setTitle("標題"); request.setDescription("下載中。。。"); // 設定下載檔案的儲存位置(這裡直接放在了根目錄下,有需要的話自行修改) File saveFile = new File(Environment.getExternalStorageDirectory(), "XXXX.apk"); request.setDestinationUri(Uri.fromFile(saveFile)); // 獲取下載管理器服務的例項, 新增下載任務 DownloadManager manager = (DownloadManager) AppContext.getInstance().getSystemService(Context.DOWNLOAD_SERVICE); // 將下載請求加入下載佇列, 返回一個下載ID return manager.enqueue(request); }

3 查詢進度

到這裡已經完成大部分了,然後就是等待下載的完成。一般會需要查詢一下進度來顯示一個進度條。
查詢方法如下:

 public static float query(long id) {
        // 獲取下載管理器服務的例項
        DownloadManager manager = (DownloadManager) AppContext.getInstance().getSystemService(Context.DOWNLOAD_SERVICE);
        // 建立一個查詢物件
        DownloadManager.Query query = new DownloadManager.Query();
        // 根據 下載ID 過濾結果c
        query.setFilterById(id);
        // 執行查詢, 返回一個 Cursor
        Cursor cursor = manager.query(query);
        if (!cursor.moveToFirst()) {
            cursor.close();
            return 0.0f;
        }
        // 已下載的位元組大小
        long downloadedSoFar = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
        // 下載檔案的總位元組大小
        long totalSize = cursor.getLong(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
        cursor.close();

        return ((float) (downloadedSoFar) / (float) (totalSize));
    }

4 啟動安裝

需要註冊一個監聽下載完成的廣播接收者,在其中直接實現執行方法。

class DownLoadCompleteReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            long myDownLoadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);  //拿到下載的Id
            if (downloadId == myDownLoadId) {
                DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
                Intent updateApk = new Intent(Intent.ACTION_VIEW);
                // 獲取下載的檔案路徑
                Uri downloadFileUri = downloadManager.getUriForDownloadedFile(myDownLoadId);
                updateApk.setDataAndType(downloadFileUri, "application/vnd.android.package-archive");
                updateApk.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                // 執行
                context.startActivity(updateApk);
            }
        }
    }

最好動態註冊,在確認更新後在去註冊。

registerReceiver(downLoadCompleteReceiver,
                            new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

記得解除這個廣播。

三、注意事項

在一些廠商的手機上例如小米,華為等,需要開啟對第三方來源應用的信任,不然會在啟動安裝的時候安裝失敗。