Android 實現本地更新並在更新完成後開啟
阿新 • • 發佈:2019-02-13
一、 簡介
現在的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));
記得解除這個廣播。
三、注意事項
在一些廠商的手機上例如小米,華為等,需要開啟對第三方來源應用的信任,不然會在啟動安裝的時候安裝失敗。