android 系統(tǒng)下載 Download Manager(一)DownloadManager.Request

從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


Request 構(gòu)造函數(shù)

2.指定下載路徑和下載文件名
該方法比較常用

//sdcard的目錄下的download文件夾嗤放,必須設(shè)置;downFileName為保存文件名
//當(dāng)路徑中該文件已經(jīng)存在時,會自動以迭代的方式命名壁酬。
request.setDestinationInExternalPublicDir("/download/", downFileName);
API18(4.3)及以后版本

API17(4.2)及以前版本

從源碼中我們可以看出下載完整目錄為
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使用颜武。

setDestinationUri

setDestinationInExternalFilesDir

setDestinationToSystemCache

以上四個方法中除了setDestinationToSystemCache是系統(tǒng)app使用外璃搜,其他三個方法最終也都是設(shè)置下載的目標URI;

Paste_Image.png

3.設(shè)置不同網(wǎng)絡(luò)狀態(tài)是否下載

//只有允許WIFIi下載
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);

表示下載允許的網(wǎng)絡(luò)類型,默認在任何網(wǎng)絡(luò)下都允許下載鳞上。
NETWORK_MOBILE这吻、NETWORK_WIFINETWORK_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的常用方法就這些了

android 系統(tǒng)下載 Download Manager(二)Download Manager使用詳情

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市流妻,隨后出現(xiàn)的幾起案子牲蜀,更是在濱河造成了極大的恐慌,老刑警劉巖绅这,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件涣达,死亡現(xiàn)場離奇詭異,居然都是意外死亡证薇,警方通過查閱死者的電腦和手機度苔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來浑度,“玉大人寇窑,你說我怎么就攤上這事÷嵴牛” “怎么了甩骏?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵窗市,是天一觀的道長。 經(jīng)常有香客問我饮笛,道長咨察,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任福青,我火速辦了婚禮摄狱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘无午。我一直安慰自己媒役,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布指厌。 她就那樣靜靜地躺著刊愚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪踩验。 梳的紋絲不亂的頭發(fā)上鸥诽,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機與錄音箕憾,去河邊找鬼牡借。 笑死,一個胖子當(dāng)著我的面吹牛袭异,可吹牛的內(nèi)容都是我干的钠龙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼御铃,長吁一口氣:“原來是場噩夢啊……” “哼碴里!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起上真,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤咬腋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后睡互,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體根竿,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年就珠,在試婚紗的時候發(fā)現(xiàn)自己被綠了寇壳。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡妻怎,死狀恐怖壳炎,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逼侦,我是刑警寧澤冕广,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布疏日,位于F島的核電站,受9級特大地震影響撒汉,放射性物質(zhì)發(fā)生泄漏沟优。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一睬辐、第九天 我趴在偏房一處隱蔽的房頂上張望挠阁。 院中可真熱鬧,春花似錦溯饵、人聲如沸侵俗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隘谣。三九已至,卻和暖如春啄巧,著一層夾襖步出監(jiān)牢的瞬間寻歧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工秩仆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留码泛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓澄耍,卻偏偏與公主長得像噪珊,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子齐莲,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容