Android 中 DownLoadManager 實現檔案下載
一、問題概述
在android開發中,經常會使用到檔案下載的功能,比如app版本更新等。在api level 9之後,android系統為我們提供了DownLoadManager類,這是android提供的系統服務,我們通過這個服務完成檔案下載。整個下載過程全部交給系統負責,不需要我們過多的處理。
通過API文件,可以看出DownLoadManager包含兩個內部類:
DownLoadManager.Query:主要用於查詢下載資訊。
DownLoadManager.Request:主要用於發起一個下載請求。
二、功能實現
首先讓我們來了解一下DownLoadManager.Request,此類封裝了一個下載請求所需要的所有資訊。通過建構函式我們可以初始化一個request物件,構造物件時需要傳入下載檔案的地址。
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("下載地址"));
構造完物件後,我們可以為request設定一些屬性:
- addRequestHeader(String header,String value):新增網路下載請求的http頭資訊
- allowScanningByMediaScanner():用於設定是否允許本MediaScanner掃描。
- setAllowedNetworkTypes(int flags):設定用於下載時的網路型別,預設任何網路都可以下載,提供的網路常量有:NETWORK_BLUETOOTH、NETWORK_MOBILE、NETWORK_WIFI。
- setAllowedOverRoaming(Boolean allowed):用於設定漫遊狀態下是否可以下載
- setNotificationVisibility(int visibility):用於設定下載時時候在狀態列顯示通知資訊
- setTitle(CharSequence):設定Notification的title資訊
- setDescription(CharSequence):設定Notification的message資訊
- setDestinationInExternalFilesDir、setDestinationInExternalPublicDir、setDestinationUri等方法用於設定下載檔案的存放路徑,注意如果將下載檔案存放在預設路徑,那麼在空間不足的情況下系統會將檔案刪除,所以使用上述方法設定檔案存放目錄是十分必要的。
建立Request物件的程式碼如下:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://gdown.baidu.com/data/wisegame/55dc62995fe9ba82/jinritoutiao_448.apk")); //設定在什麼網路情況下進行下載 request.setAllowedNetworkTypes(Request.NETWORK_WIFI); //設定通知欄標題 request.setNotificationVisibility(Request.VISIBILITY_VISIBLE); request.setTitle("下載"); request.setDescription("今日頭條正在下載"); request.setAllowedOverRoaming(false); //設定檔案存放目錄 request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "mydown");
取得系統服務後,呼叫downloadmanager物件的enqueue方法進行下載,此方法返回一個編號用於標示此下載任務:
downManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE); id= downManager.enqueue(request);
如果想取消下載,則可以呼叫remove方法完成,此方法可以將下載任務和已經下載的檔案同時刪除:
downManager.remove(id);
在檔案下載完成時,我們經常需要做一下後操作,比如apk,怎需要直接顯示安裝,那麼我們如何監聽檔案時候已經下載完成了呢?DownLoadManager在檔案現在完成時會傳送一個action為ACTION_DOWNLOAD_COMPLETE的廣播,我們只要註冊一個廣播接收器即可進行處理:
private class DownLoadCompleteReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){ long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); Toast.makeText(MainActivity.this, "編號:"+id+"的下載任務已經完成!", Toast.LENGTH_SHORT).show(); }else if(intent.getAction().equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)){ Toast.makeText(MainActivity.this, "別瞎點!!!", Toast.LENGTH_SHORT).show(); } } }
DownManager會對所有的現在任務進行儲存管理,那麼我們如何獲取這些資訊呢?這個時候就要用到DownManager.Query物件,通過此物件,我們可以查詢所有下載任務資訊。
setFilterById(long… ids):根據任務編號查詢下載任務資訊
setFilterByStatus(int flags):根據下載狀態查詢下載任務
具體使用方法如下:
private void queryDownTask(DownloadManager downManager,int status) { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterByStatus(status); Cursor cursor= downManager.query(query); while(cursor.moveToNext()){ String downId= cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_ID)); String title = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)); String address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); //String statuss = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); String size= cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); String sizeTotal = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); Map<String, String> map = new HashMap<String, String>(); map.put("downid", downId); map.put("title", title); map.put("address", address); map.put("status", sizeTotal+":"+size); this.data.add(map); } cursor.close(); }
具體可以檢視哪些資訊,可以檢視DownLoadManger下的Column_*常量資訊。
三、原始碼下載
想要親自體驗效果的同學,可以下載原工程,直接執行檢視!
相關文章
- Android實現zip檔案下載和解壓功能Android
- Flutter實現檔案下載Flutter
- AJAX實現檔案下載----
- 4 行程式碼實現 Android 快速檔案下載行程Android
- Flutter 實現檔案下載功能Flutter
- Java實現檔案下載功能Java
- Weex 實現檔案的下載
- servlet實現檔案下載demoServlet
- Django 實現下載檔案功能Django
- 利用IhttpHandler實現檔案下載HTTP
- 使用Servlet實現檔案下載Servlet
- 在ofbiz體系中如何實現檔案下載?
- js下載檔案的實現方式JS
- js實現txt/excel檔案下載JSExcel
- Java程式碼實現下載檔案Java
- vc實現https檔案下載HTTP
- Android 使用 DownloadManager 管理系統下載任務的方法Android
- Android開發之自帶下載器DownloadManager的使用Android
- Downloadmanager in androidAndroid
- vue/js實現檔案流下載,檔案下載進度監聽VueJS
- Feign實現檔案上傳下載
- PowerShell實現檔案下載(類wget)wget
- 如何實現java檔案佇列下載Java佇列
- jsp下載檔案的實現方法JS
- Android okhttp+rxjava實現多檔案下載和斷點續傳AndroidHTTPRxJava斷點
- iis實現點選檔案下載而不是開啟檔案
- javaWeb不生成臨時檔案實現壓縮檔案下載JavaWeb
- java實現檔案的下載的方法概述Java
- 前端實現檔案下載和拖拽上傳前端
- java實現sftp檔案的上傳下載JavaFTP
- 用C++實現下載檔案的功能C++
- SpringMVC實現檔案上傳&下載(2)SpringMVC
- 在Oracle中存取BLOB物件實現檔案的上傳和下載Oracle物件
- Java實現上傳檔案到Oracle及從Oracle下載檔案JavaOracle
- Java多執行緒檔案分片下載實現Java執行緒
- Javascript 實現一個post方式的檔案下載JavaScript
- vue實現Excel檔案的上傳與下載VueExcel
- JavaWeb之實現檔案上傳與下載工具JavaWeb