從Android2.3(API level 9)開始Android用系統(tǒng)服務(wù)(Service)的方式提供了Download Manager來優(yōu)化處理長時間的下載操作晌杰。
Download Manager處理HTTP連接并監(jiān)控連接中的狀態(tài)變化以及系統(tǒng)重啟來確保每一個下載任務(wù)順利完成拣凹。在大多數(shù)涉及到下載的情況中使用Download Manager都是不錯的選擇蝎土,特別是當(dāng)用戶切換不同的應(yīng)用以后下載需要在后臺繼續(xù)進行砸讳,以及當(dāng)下載任務(wù)順利完成非常重要的情況(DownloadManager對于斷點續(xù)傳功能支持很好)矛市。
簡單的使用方法
//創(chuàng)建下載任務(wù),downloadUrl就是下載鏈接
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));
//指定下載路徑和下載文件名
request.setDestinationInExternalPublicDir("/download/", fileName);
//獲取下載管理器
DownloadManager downloadManager= (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
//將下載任務(wù)加入下載隊列严蓖,否則不會進行下載
downloadManager.enqueue(request);
使用的時候需要添加權(quán)限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Download Manager簡介
DownloadManager是系統(tǒng)開放給第三方應(yīng)用使用的類鳞绕,包含兩個靜態(tài)內(nèi)部類:
DownloadManager.Request:用來請求一個下載
DownloadManager.Query:用來查詢下載信息龙填,這兩個類的具體功能會在后面穿插介紹胳泉。
**使用Download Manager 流程: **
1.創(chuàng)建一個下載Request
2.將創(chuàng)建的Request添加到Download Manager 就好了
DownloadManager主要提供了下面幾個接口:
public long enqueue(Request request):執(zhí)行下載拐叉,返回downloadId,downloadId可用于后面查詢下載信息扇商。若網(wǎng)絡(luò)不滿足條件凤瘦、Sdcard掛載中、超過最大并發(fā)數(shù)等異常會等待下載钳吟,正常則直接下載廷粒。
public int remove(long… ids)刪除下載,若下載中取消下載红且。會同時刪除下載文件和記錄坝茎。
首先創(chuàng)建一個下載請求 ------DownloadManager.Request
DownloadManager.Request除了構(gòu)造函數(shù)的Uri外,其他設(shè)置都為可選設(shè)置暇番;
1.創(chuàng)建Request
//downUrl為下載地址
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl));
通過源代碼可以看出開 只能下載HTTP或者HTTPS的URI
2.指定下載路徑和下載文件名
該方法比較常用
//sdcard的目錄下的download文件夾嗤放,必須設(shè)置;downFileName為保存文件名
//當(dāng)路徑中該文件已經(jīng)存在時,會自動以迭代的方式命名壁酬。
request.setDestinationInExternalPublicDir("/download/", downFileName);
從源碼中我們可以看出下載完整目錄為
Environment.getExternalStoragePublicDirectory(dirType)次酌。
不過在在API17(4.2)及以前版本中file是通過file.mkdir()創(chuàng)建的,這樣如果上級目錄不存在就會新建文件夾異常舆乔。所以版本兼容到4.2及以前的岳服,在下載前我們最好自己調(diào)用File的mkdirs方法遞歸創(chuàng)建子目錄,如下:
File folder = new File(folderName);
return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();
其他設(shè)置下載路徑接口:為setDestinationUri希俩,setDestinationInExternalFilesDir吊宋,setDestinationToSystemCache。其中setDestinationToSystemCache僅限系統(tǒng)app使用颜武。
以上四個方法中除了setDestinationToSystemCache是系統(tǒng)app使用外璃搜,其他三個方法最終也都是設(shè)置下載的目標URI;
3.設(shè)置不同網(wǎng)絡(luò)狀態(tài)是否下載
//只有允許WIFIi下載
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
表示下載允許的網(wǎng)絡(luò)類型,默認在任何網(wǎng)絡(luò)下都允許下載鳞上。
有NETWORK_MOBILE这吻、NETWORK_WIFI、NETWORK_BLUETOOTH三種及其組合可供選擇篙议。如果只允許wifi下載唾糯,而當(dāng)前網(wǎng)絡(luò)為3g,則下載會等待鬼贱。
Android API level 11 介紹了getRecommendedMaxBytesOverMobile類方法(靜態(tài)方法)趾断,返回一個當(dāng)前手機網(wǎng)絡(luò)連接下的最大建議字節(jié)數(shù),可以來判斷下載是否應(yīng)該限定在WiFi條件下吩愧。
//移動網(wǎng)絡(luò)情況下是否允許漫游芋酌。默認是true
request.setAllowedOverRoaming(boolean allow)
4.設(shè)置下載中通知欄提示
//默認只顯示下載中通知
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
表示下載進行中和下載完成的通知欄是否顯示。
Request.VISIBILITY_VISIBLE:在下載進行的過程中雁佳,通知欄中會一直顯示該下載的Notification脐帝,當(dāng)下載完成時同云,該Notification會被移除,這是默認的參數(shù)值堵腹。
Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED:在下載過程中通知欄會一直顯示該下載的Notification炸站,在下載完成后該Notification會繼續(xù)顯示,直到用戶點擊該Notification或者消除該Notification疚顷。
Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION:只有在下載完成后該Notification才會被顯示旱易。
Request.VISIBILITY_HIDDEN:不顯示該下載請求的Notification。如果要使用這個參數(shù)腿堤,需要在應(yīng)用的清單文件中加上DOWNLOAD_WITHOUT_NOTIFICATION權(quán)限阀坏。
注:該方法只支持API 11及以后(3.0),若在API 9 和API 10中可以用
//在API 11以后被標記為@Deprecated
request.setShowRunningNotification(boolean show);
//下載任務(wù)標題
request.setTitle(“Earthquakes”);
//下載文件描述
request.setDescription(“Earthquake XML”);
5.設(shè)置文件類型笆檀,可以在下載結(jié)束后自動打開該文件
我們可以通過addRequestHeader方法為DownloadManager.Request對象request添加HTTP頭忌堂;
也可以通過setMimeType方法重寫從服務(wù)器返回的mime type,設(shè)置下載文件的mineType酗洒。因為下載管理Ui中點擊某個已下載完成文件及下載完成點擊通知欄提示都會根據(jù)mimeType去打開文件士修,所以我們可以利用這個屬性。比如上面設(shè)置了mimeType為application/cn.trinea.download.file樱衷,我們可以同時設(shè)置某個Activity的intent-filter為application/cn.trinea.download.file棋嘲,用于響應(yīng)點擊的打開文件。
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="application/cn.trinea.download.file" />
</intent-filter>
6.是否允許MediaScanner掃描到這個文件
//表示允許MediaScanner掃描到這個文件矩桂,默認不允許沸移。
request.allowScanningByMediaScanner();
7.如果我們希望下載的文件可以被系統(tǒng)的Downloads應(yīng)用掃描到并管理
request.setVisibleInDownloadsUi(boolean isVisible); 默認是允許的。
8.是否允許“計量式的網(wǎng)絡(luò)連接”執(zhí)行下載操作
//不太明白這個是干嘛的 一般的時候使用默認的就好了
request.setAllowedOverMetered(boolean); 默認是允許的耍鬓。
DownloadManager.Request的常用方法就這些了