DownloadManager實(shí)現(xiàn)文件下載功能
前言
關(guān)于文件下載,或許不是一個(gè)多么陌生的內(nèi)容,在網(wǎng)絡(luò)操作中下載只是其中一個(gè)方面,但是關(guān)于文件下載還是有不少東西要說(shuō),今天我就拿下載的方式來(lái)說(shuō)吧。
文件下載有許多方式,比如什么多線程下載,單線程下載等等,我剛開(kāi)始接觸文件下載的時(shí)候是看了一個(gè)《關(guān)于文件多線程下載原理》的一個(gè)視頻,里面講了什么是多線程下載,然后就是自己寫一個(gè)下載類,實(shí)現(xiàn)文件下載,雖然最后也是能夠?qū)崿F(xiàn)下載,但是效果并不是多么的好,有時(shí)候文件無(wú)法下載成功,那時(shí)候我就想應(yīng)該有封裝好的工具來(lái)幫助實(shí)現(xiàn)下載。確實(shí),后來(lái)百度了一下,我找到許多的第三方j(luò)ar包來(lái)實(shí)現(xiàn)下載,其中Afinal框架是我一直在用的,還不錯(cuò)。不想每一次都是用第三方的東西,android系統(tǒng)應(yīng)該自己擁有下載的工具類,然后就是我們今天要講的 DownloadManager了。
接觸DownloadManager是因?yàn)槲仪耙欢螘r(shí)間在寫自己的一個(gè)音樂(lè)播放器,需要從網(wǎng)絡(luò)獲取歌曲并下載,這個(gè)時(shí)候我就想找一個(gè)簡(jiǎn)單是用的下載方式然后就認(rèn)識(shí)了它,關(guān)于它的使用我還沒(méi)做具體的深究,只是把它用在了自己的應(yīng)用里面,現(xiàn)在寫出來(lái)分享一下當(dāng)時(shí)是怎么做的。
實(shí)現(xiàn)
下載我主要關(guān)心三個(gè)方面的內(nèi)容:
從哪來(lái)
到哪去
完成之后的操作
這三方面的內(nèi)容就是最重要的,下面我就下載一首歌來(lái)進(jìn)行說(shuō)明:
我們首先需要得到DownloadManager的一個(gè)實(shí)例,它既然是系統(tǒng)提供的服務(wù),自然需要用getSystemService來(lái)得到了。
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
得到manager對(duì)象之后我們就需要一個(gè)下載請(qǐng)求,把下載的信息(也即“從哪來(lái)”,“到哪去”)設(shè)置進(jìn)去。下載請(qǐng)求是DownloadManager的一個(gè)內(nèi)部類Request,我們先生成Request的對(duì)象:DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));可以看到Request的一個(gè)構(gòu)造函數(shù)傳入的是一個(gè)Uri對(duì)象,我們調(diào)用Uri的靜態(tài)方法來(lái)根據(jù)下載的Url得到一個(gè)Uri對(duì)象,這也就是我們說(shuō)的”從哪來(lái)“。
下面還有三個(gè)Request的三個(gè)方法需要我們調(diào)用:
setTitle(String title)
setDescription(String desc)
setNotificationVisibility(int flag)
其中setTitle是設(shè)置下載的標(biāo)題,setDescription設(shè)置下載描述,示例圖如下:
其中”Nobody“是標(biāo)題,“WonderGirls”是描述。
setNotificationVisibility方法就需要好好說(shuō)說(shuō)了,它的參數(shù)有四種情況:
Request.VISIBILITY_VISIBLE:在下載進(jìn)行的過(guò)程中,通知欄中會(huì)一直顯示該下載的Notification,當(dāng)下載完成時(shí),該Notification會(huì)被移除,這是默認(rèn)的參數(shù)值。
Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED:在下載過(guò)程中通知欄會(huì)一直顯示該下載的Notification,在下載完成后該Notification會(huì)繼續(xù)顯示,直到用戶點(diǎn)擊該Notification或者消除該Notification。
Request.VISIBILITY_VISIBLE_NOTIFY_ONLY_COMPLETION:只有在下載完成后該Notification才會(huì)被顯示。
Request.VISIBILITY_HIDDEN:不顯示該下載請(qǐng)求的Notification。如果要使用這個(gè)參數(shù),需要在應(yīng)用的清單文件中加上DOWNLOAD_WITHOUT_NOTIFICATION權(quán)限。
我們根據(jù)需要選擇合適的參數(shù),如果我們不希望下載的時(shí)候顯示進(jìn)度,那么我們就可以設(shè)置Request.VISIBILITY_HIDDEN,這樣在下載的時(shí)候我們就看不到通知了,不過(guò)這樣的壞處是我們就無(wú)法知道下載是否成功了。
“從哪來(lái)”的問(wèn)題解決了,現(xiàn)在我們來(lái)看“到哪去”的問(wèn)題:setDestinationUri這個(gè)函數(shù)用來(lái)設(shè)置下載路徑,參數(shù)是一個(gè)Uri對(duì)象,使用如下:
String path = "/storage/sdcard1/music/許嵩 - 幻聽(tīng).mp3"; File file = new File(path); Uri uri = Uri.fromFile(file); request.setDestinationUri(uri);
這樣我們就設(shè)置好了下載的路徑。
Request設(shè)置好了之后我們就可以調(diào)用manager的方法開(kāi)始下載了:
manager.enqueue(request);這個(gè)方法就是把下載請(qǐng)求放到一個(gè)隊(duì)列里面然后就開(kāi)始下載,它有一個(gè)返回值,這個(gè)返回值是一個(gè)下載id,用來(lái)唯一標(biāo)示這一次的下載,在下面我們會(huì)用到這個(gè)id,我們把它記為mDownloadID;
最后就剩下載完成之后的情況了,下載完成之后我們可能還會(huì)有操作,比如下載完成之后打開(kāi)文件等等,就像我們看到了一些軟件進(jìn)行升級(jí),下載完成apk文件之后就直接打開(kāi)安裝,這都是下載完成之后的操作,那么該如何實(shí)現(xiàn)呢?
原來(lái)DownloadManager在下載完成之后會(huì)發(fā)送一個(gè)廣播,我們只需要注冊(cè)一個(gè)廣播接收器得到廣播就可以進(jìn)行我們自己的操作了。
IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { long reference = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); if (mDownloadID == reference){ Intent i = new Intent(); i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.setAction(Intent.ACTION_VIEW); String type = "application/vnd.android.package-archive"; i.setDataAndType(Uri.fromFile(file),type); mContext.startActivity(i); } } }; mContext.registerReceiver(receiver, filter);
這樣我們就自己注冊(cè)了一個(gè)廣播接收器,用來(lái)接收下載完成之后發(fā)送的廣播,接收到之后我們就直接打開(kāi)文件,在代碼中,我設(shè)置的是打開(kāi)apk文件,即設(shè)置文件類型為”application/vnd.android.package-archive“,其中mDownloadID就是我們得到的那個(gè)下載ID,這樣我們實(shí)現(xiàn)了文件的下載和打開(kāi)。
小結(jié)
這樣看來(lái)文件下載并不是多么的復(fù)雜,當(dāng)然我們只是站在用代碼的角度,如果讓我們自己去寫下載源碼,呵呵,無(wú)能為力了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android基于自帶的DownloadManager實(shí)現(xiàn)下載功能示例
- Android中DownloadManager實(shí)現(xiàn)文件下載實(shí)例詳解
- android中DownloadManager實(shí)現(xiàn)版本更新,監(jiān)聽(tīng)下載進(jìn)度實(shí)例
- Android開(kāi)發(fā)之自帶下載器DownloadManager的使用示例代碼
- 使用Android系統(tǒng)提供的DownloadManager來(lái)下載文件
- Android中使用DownloadManager類來(lái)管理數(shù)據(jù)下載的教程
- 基于DownloadManager的簡(jiǎn)單下載器編寫小結(jié)
相關(guān)文章
使用Messenger實(shí)現(xiàn)Service的雙向通信
這篇文章主要為大家詳細(xì)介紹了使用Messenger實(shí)現(xiàn)Service的雙向通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05Android把商品添加到購(gòu)物車的動(dòng)畫效果(貝塞爾曲線)
本篇文章介紹了Android把商品添加到購(gòu)物車的動(dòng)畫效果,這個(gè)在很多項(xiàng)目中都用的到,具有一定的參考價(jià)值,有需要的可以了解一下。2016-10-10Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法總結(jié)
本文主要介紹Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法,這里提供了代碼示例,有需要的小伙伴可以參考下2016-09-09Android開(kāi)發(fā)中的重力傳感器用法實(shí)例詳解
這篇文章主要介紹了Android開(kāi)發(fā)中的重力傳感器用法,簡(jiǎn)單分析了Android重力傳感器的基本功能、使用方法,并結(jié)合實(shí)例形式分析了Android基于重力傳感器實(shí)現(xiàn)橫豎屏切換的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android編程中TextView寬度過(guò)大導(dǎo)致Drawable無(wú)法居中問(wèn)題解決方法
這篇文章主要介紹了Android編程中TextView寬度過(guò)大導(dǎo)致Drawable無(wú)法居中問(wèn)題解決方法,以實(shí)例形式較為詳細(xì)的分析了TextView設(shè)置及xml布局與調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10關(guān)于androidstuio導(dǎo)入系統(tǒng)源碼的問(wèn)題
小編最近在做系統(tǒng)源碼導(dǎo)出來(lái)的小項(xiàng)目,在導(dǎo)入androidstudio過(guò)程中遇到過(guò)一些問(wèn)題,本文以Schedule power on off為例給大家詳細(xì)介紹,需要的朋友參考下吧2021-06-06Android應(yīng)用圖標(biāo)上的小紅點(diǎn)Badge實(shí)踐代碼
本篇文章主要介紹了Android應(yīng)用圖標(biāo)上的小紅點(diǎn)Badge實(shí)踐代碼,具有一定的參考價(jià)值,有興趣的可以了解一下2017-07-07使用Flutter 構(gòu)建Web應(yīng)用邏輯解析
這篇文章主要為大家介紹了使用Flutter 構(gòu)建Web應(yīng)用邏輯解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12