僅4行代碼實(shí)現(xiàn)Android快速文件下載
寫在前面的廢話
下載文件,幾乎是所有APP都會用到的功能!算了,還是不廢話了,直接開寫吧。。。
簡單使用
完成一個下載任務(wù)只需要4行代碼,什么斷點(diǎn)續(xù)傳,大文件下載,通知欄進(jìn)度顯示….都不需要你操心。
//創(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ù)加入下載隊(duì)列,否則不會進(jìn)行下載
downloadManager.enqueue(request);
高級用法
----通過上面的代碼大家也看出來了,我們使用的是系統(tǒng)提供的下載管理器進(jìn)行下載,從API 9就開始支持了,所以不用擔(dān)心在兼容問題
----既然是系統(tǒng)提供的,那么肯定還有更加強(qiáng)大的用法,文章繼續(xù)
讓我們看DownloadManager的源碼,提供了這么多方法

DownloadManager的方法

DownloadManager.Request的方法
方法差不多就這些,已經(jīng)比較全了,可以滿足我們絕大部分的使用場景。
實(shí)際使用
接下來我們就以APP應(yīng)用內(nèi)更新為例,講一下這些方法的使用
1.首先我們梳理下APP應(yīng)用內(nèi)更新的邏輯

APP應(yīng)用內(nèi)更新
2.接下來看具體實(shí)現(xiàn),上代碼
//使用系統(tǒng)下載器下載
private void downloadAPK(String versionUrl, String versionName) {
//創(chuàng)建下載任務(wù)
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(versionUrl));
request.setAllowedOverRoaming(false);//漫游網(wǎng)絡(luò)是否可以下載
//設(shè)置文件類型,可以在下載結(jié)束后自動打開該文件
MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(versionUrl));
request.setMimeType(mimeString);
//在通知欄中顯示,默認(rèn)就是顯示的
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);
request.setVisibleInDownloadsUi(true);
//sdcard的目錄下的download文件夾,必須設(shè)置
request.setDestinationInExternalPublicDir("/download/", versionName);
//request.setDestinationInExternalFilesDir(),也可以自己制定下載路徑
//將下載請求加入下載隊(duì)列
downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);
//加入下載隊(duì)列后會給該任務(wù)返回一個long型的id,
//通過該id可以取消任務(wù),重啟任務(wù)等等,看上面源碼中框起來的方法
mTaskId = downloadManager.enqueue(request);
//注冊廣播接收者,監(jiān)聽下載狀態(tài)
mContext.registerReceiver(receiver,
new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
接下來是廣播接收器
//廣播接受者,接收下載狀態(tài)
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
checkDownloadStatus();//檢查下載狀態(tài)
}
};
檢查下載狀態(tài)
//檢查下載狀態(tài)
private void checkDownloadStatus() {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(mTaskId);//篩選下載任務(wù),傳入任務(wù)ID,可變參數(shù)
Cursor c = downloadManager.query(query);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (status) {
case DownloadManager.STATUS_PAUSED:
MLog.i(">>>下載暫停");
case DownloadManager.STATUS_PENDING:
MLog.i(">>>下載延遲");
case DownloadManager.STATUS_RUNNING:
MLog.i(">>>正在下載");
break;
case DownloadManager.STATUS_SUCCESSFUL
MLog.i(">>>下載完成");
//下載完成安裝APK
//downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + File.separator + versionName;
installAPK(new File(downloadPath));
break;
case DownloadManager.STATUS_FAILED:
MLog.i(">>>下載失敗");
break;
}
}
}
安裝APK
//下載到本地后執(zhí)行安裝
protected void installAPK(File file) {
if (!file.exists()) return;
Intent intent = new Intent(Intent.ACTION_VIEW);
Uri uri = Uri.parse("file://" + file.toString());
intent.setDataAndType(uri, "application/vnd.android.package-archive");
//在服務(wù)中開啟activity必須設(shè)置flag,后面解釋
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mContext.startActivity(intent);
}
到此就完成了應(yīng)用內(nèi)更新APP的代碼,但是有一些坑需要注意!
希望你可以看到最后這幾句,不然你也會被坑的!
1.雖然下載什么的不需要自己操心了,但是建議還是將整個上面四段代碼放在Service中執(zhí)行,因?yàn)榉旁贏ctivity中時,當(dāng)用戶按home鍵后,即使下載完了,也不會彈出安裝界面
2.建議使用startService的方式啟動Service,這樣不會與Activity生命周期綁定,保證下載完后能順利安裝。
3.Service使用完后要及時地停掉!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android 將文件下載到指定目錄的實(shí)現(xiàn)代碼
- Android 文件下載三種基本方式
- Android中DownloadManager實(shí)現(xiàn)文件下載實(shí)例詳解
- Android Retrofit文件下載進(jìn)度顯示問題的解決方法
- Android中使用AsyncTask實(shí)現(xiàn)文件下載以及進(jìn)度更新提示
- Android實(shí)現(xiàn)網(wǎng)絡(luò)多線程文件下載
- Android實(shí)現(xiàn)文件下載進(jìn)度顯示功能
- Android使用緩存機(jī)制實(shí)現(xiàn)文件下載及異步請求圖片加三級緩存
- Android zip文件下載和解壓實(shí)例
- Android文件下載功能實(shí)現(xiàn)代碼
相關(guān)文章
Android實(shí)現(xiàn)EditText添加下劃線
這篇文章主要為大家詳細(xì)介紹了Android如何實(shí)現(xiàn)給EditText添加下劃線,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08
Android編程中Perferences的用法實(shí)例分析
這篇文章主要介紹了Android編程中Perferences的用法,以實(shí)例形式較為詳細(xì)的分析了配置文件preferences.xml的功能、定義及使用方法,具有一定參考借鑒價值,需要的朋友可以參考下2015-11-11
Android實(shí)現(xiàn)雙擊TitleBar回頂部的功能示例代碼
一個簡單易用的導(dǎo)航欄TitleBar,可以輕松實(shí)現(xiàn)IOS導(dǎo)航欄的各種效果,下面這篇文章主要給大家介紹了關(guān)于Android如何實(shí)現(xiàn)雙擊TitleBar回頂部功能的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。2017-09-09
Android中使用TagFlowLayout制作動態(tài)添加刪除標(biāo)簽
這篇文章主要介紹了Android中使用TagFlowLayout制作動態(tài)添加刪除標(biāo)簽的步驟詳解,需要的朋友參考下吧2017-07-07
android在異步任務(wù)中關(guān)閉Cursor的代碼方法
android在異步任務(wù)中如何關(guān)閉Cursor?在我們開發(fā)應(yīng)用的時候,很多時候會遇到這種問題,下面我們就看看代碼如何實(shí)現(xiàn)2013-11-11
Android adb logcat 命令查看日志詳細(xì)介紹
這篇文章主要介紹了Android adb logcat 命令詳細(xì)介紹的相關(guān)資料,這里對logcat 命令進(jìn)行了詳細(xì)介紹,并介紹了過濾日志輸出的知識,需要的朋友可以參考下2016-12-12
Android開發(fā)實(shí)現(xiàn)Fragment監(jiān)聽返回鍵事件功能的方法
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)Fragment監(jiān)聽返回鍵事件功能的方法,結(jié)合實(shí)例形式分析了Android使用Fragment監(jiān)聽并屏蔽返回鍵按鈕的實(shí)現(xiàn)方法與相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
Android仿微信左右滑動點(diǎn)擊切換頁面和圖標(biāo)
這篇文章主要為大家詳細(xì)介紹了Android仿微信左右滑動點(diǎn)擊切換頁面和圖標(biāo),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-05-05
Android RatingBar星星評分控件實(shí)例代碼
本文通過實(shí)例代碼給大家介紹了Android RatingBar星星評分控件,非常不錯,具有參考借鑒價值,需要的朋友參考下吧2017-06-06

