国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設計 > 正文

DownloadManager的使用

2019-11-08 00:28:56
字體:
供稿:網(wǎng)友

Android系統(tǒng)下載管理DownloadManager功能介紹及使用示例

本文主要結(jié)合源碼介紹Android系統(tǒng)下載管理DownloadManager的強大功能及使用。這是許久來準備寫的一系列博客,這篇主要介紹DownloadManager的功能和示例,后面還有兩篇會介紹下載管理的底層設計(DownloadPRovider、DownloadManager、DownloadManagerUI)、下載管理如何進行功能增強和bug修改。

 

本文可運行APK地址可見TrineaAndroidDemo.apk,可運行代碼地址可見DownloadManager Demo,效果圖如下:

downloadDemo

關于下載管理的廢話

 

一、DownloadManager簡單介紹DownloadManager是系統(tǒng)開放給第三方應用使用的類,包含兩個靜態(tài)內(nèi)部類DownloadManager.Query和DownloadManager.Request。DownloadManager.Request用來請求一個下載,DownloadManager.Query用來查詢下載信息,這兩個類的具體功能會在后面穿插介紹。DownloadManager的源碼可見DownloadManager@Grepcode。

 

DownloadManager主要提供了下面幾個接口:public long enqueue(Request request)執(zhí)行下載,返回downloadId,downloadId可用于后面查詢下載信息。若網(wǎng)絡不滿足條件、Sdcard掛載中、超過最大并發(fā)數(shù)等異常會等待下載,正常則直接下載。public int remove(long… ids)刪除下載,若下載中取消下載。會同時刪除下載文件和記錄。public Cursor query(Query query)查詢下載信息。

 

public static Long getRecommendedMaxBytesOverMobile(Context context通過移動網(wǎng)絡下載的最大字節(jié)數(shù)public String getMimeTypeForDownloadedFile(long id)得到下載的mimeType,如何設置后面會進行介紹

 

其它:通過查看代碼我們可以發(fā)現(xiàn)還有個CursorTranslator私有靜態(tài)內(nèi)部類。這個類主要對Query做了一層代理。將DownloadProvider和DownloadManager之間做個映射。將DownloadProvider中的十幾種狀態(tài)對應到了DownloadManager中的五種狀態(tài),DownloadProvider中的失敗、暫停原因轉(zhuǎn)換為了DownloadManager的原因。

 

二、下載管理示例下面具體介紹利用DownloadManager進行下載。1、AndroidManifest中添加權限

java
12<uses-permission android:name="android.permission.INTERNET" /><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

網(wǎng)絡訪問權限是必須的,下載地址為sdcard的話需要添加sdcard寫權限。

 

2、調(diào)用DownloadManager.Request開始下載

Java
1234567891011DownloadManager downloadManager = (DownloadManager)getSystemService(DOWNLOAD_SERVICE);String apkUrl = "http://img.meilishuo.net/CSS/images/AndroidShare/Meilishuo_3.6.1_10006.apk";DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl));request.setDestinationInExternalPublicDir("Trinea", "MeiLiShuo.apk");// request.setTitle("MeiLiShuo");// request.setDescription("MeiLiShuo desc");// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);// request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);// request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);// request.setMimeType("application/com.trinea.download.file");long downloadId = downloadManager.enqueue(request);

上面調(diào)用downloadManager的enqueue接口進行下載,返回唯一的downloadId。

 

DownloadManager.Request除了構造函數(shù)的Uri必須外,其他設置都為可選設置。下面逐個介紹下:request.setDestinationInExternalPublicDir(“Trinea”, “MeiLiShuo.apk”);表示設置下載地址為sd卡的Trinea文件夾,文件名為MeiLiShuo.apk。

setDestinationInExternalPublicDir源碼

從源碼中我們可以看出下載完整目錄為Environment.getExternalStoragePublicDirectory(dirType)。不過file是通過file.mkdir()創(chuàng)建的,這樣如果上級目錄不存在就會新建文件夾異常。所以下載前我們最好自己調(diào)用File的mkdirs方法遞歸創(chuàng)建子目錄,如下:

Java
12File folder = new File(folderName);return (folder.exists() && folder.isDirectory()) ? true : folder.mkdirs();

否則,會報異常

12java.lang.IllegalStateException: Unable to create directory: /storage/sdcard0/Trinea/aaat android.app.DownloadManager$Request.setDestinationInExternalPublicDir(DownloadManager.java)

其他設置下載路徑接口為setDestinationUri,setDestinationInExternalFilesDir,setDestinationToSystemCache。其中setDestinationToSystemCache僅限系統(tǒng)app使用。

 

request.allowScanningByMediaScanner();表示允許MediaScanner掃描到這個文件,默認不允許。

request.setTitle(“MeiLiShuo”);設置下載中通知欄提示的標題request.setDescription(“MeiLiShuo desc”);設置下載中通知欄提示的介紹request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);表示下載進行中和下載完成的通知欄是否顯示。默認只顯示下載中通知。VISIBILITY_VISIBLE_NOTIFY_COMPLETED表示下載完成后顯示通知欄提示。VISIBILITY_HIDDEN表示不顯示任何通知欄提示,這個需要在AndroidMainfest中添加權限android.permission.DOWNLOAD_WITHOUT_NOTIFICATION.

 

request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);表示下載允許的網(wǎng)絡類型,默認在任何網(wǎng)絡下都允許下載。有NETWORK_MOBILE、NETWORK_WIFI、NETWORK_BLUETOOTH三種及其組合可供選擇。如果只允許wifi下載,而當前網(wǎng)絡為3g,則下載會等待。request.setAllowedOverRoaming(boolean allow)移動網(wǎng)絡情況下是否允許漫游。

 

request.setMimeType(“application/com.trinea.download.file”);設置下載文件的mineType。因為下載管理Ui中點擊某個已下載完成文件及下載完成點擊通知欄提示都會根據(jù)mimeType去打開文件,所以我們可以利用這個屬性。比如上面設置了mimeType為application/com.trinea.download.file,我們可以同時設置某個Activity的intent-filter為application/com.trinea.download.file,用于響應點擊的打開文件。

Java
1234567<intent-filter>    <action android:name="android.intent.action.VIEW" />     <category android:name="android.intent.category.DEFAULT" />     <data android:mimeType="application/com.trinea.download.file" /></intent-filter>

request.addRequestHeader(String header, String value)添加請求下載的網(wǎng)絡鏈接的http頭,比如User-Agent,gzip壓縮等

 

3 下載進度狀態(tài)監(jiān)聽及查詢

下載進度狀態(tài)監(jiān)聽代碼

其中我們會監(jiān)聽Uri.parse(“content://downloads/my_downloads”)。然后查詢下載狀態(tài)和進度,發(fā)送handler進行更新,handler中處理就是設置進度條和狀態(tài)等。

其中DownloadManagerPro.getBytesAndStatus的主要代碼如下,可直接引入TrineaAndroidCommon@Github(歡迎star和fork^_^)或TrineaAndroidCommon@GoogleCode作為你項目的library(如何拉取代碼及添加公共庫):

下載進度狀態(tài)查詢代碼

從上面代碼可以看出我們主要調(diào)用DownloadManager.Query()進行查詢。DownloadManager.Query為下載管理對外開放的信息查詢類,主要包括以下接口:

setFilterById(long… ids)根據(jù)下載id進行過濾setFilterByStatus(int flags)根據(jù)下載狀態(tài)進行過濾setOnlyIncludeVisibleInDownloadsUi(boolean value)根據(jù)是否在download ui中可見進行過濾。

 

orderBy(String column, int direction)根據(jù)列進行排序,不過目前僅支持DownloadManager.COLUMN_LAST_MODIFIED_TIMESTAMP和DownloadManager.COLUMN_TOTAL_SIZE_BYTES排序。

 

4 下載成功監(jiān)聽下載完成后,下載管理會發(fā)出DownloadManager.ACTION_DOWNLOAD_COMPLETE這個廣播,并傳遞downloadId作為參數(shù)。通過接受廣播我們可以打開對下載完成的內(nèi)容進行操作。代碼如下:

下載成功監(jiān)聽

 

5、響應通知欄點擊(1) 響應下載中通知欄點擊點擊下載中通知欄提示,系統(tǒng)會對下載的應用單獨發(fā)送Action為DownloadManager.ACTION_NOTIFICATION_CLICKED廣播。intent.getData為content://downloads/all_downloads/29669,最后一位為downloadId。如果同時下載多個應用,intent會包含DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS這個key,表示下載的的downloadId數(shù)組。這里設計到下載管理通知欄的顯示機制,會在下一篇具體介紹。

 

(2) 響應下載完成通知欄點擊下載完后會調(diào)用下面代碼進行處理,從中我們可以發(fā)現(xiàn)系統(tǒng)會調(diào)用View action根據(jù)mimeType去查詢。所以可以利用我們在介紹的DownloadManager.Request的setMimeType函數(shù)。

openDownload源碼

 

如果界面上過多元素需要更新,且網(wǎng)速較快不斷的執(zhí)行onChange會對頁面性能有一定影響。推薦ScheduledExecutorService定期查詢,如下:

Java
123456789public static ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(3);Runnable command = new Runnable() {         @Override        public void run() {            updateView();        }    };scheduledExecutorService.scheduleAtFixedRate(command, 0, 3, TimeUnit.SECONDS);

表示3秒定時刷新

完結(jié)!!


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 沁阳市| 浦东新区| 中山市| 北碚区| 普定县| 兴仁县| 连城县| 盘锦市| 和田市| 桐庐县| 大埔区| 叶城县| 开远市| 梁平县| 聊城市| 海安县| 左权县| 海淀区| 榆社县| 咸丰县| 山西省| 宜州市| 西乌珠穆沁旗| 北安市| 金塔县| 松溪县| 绍兴县| 凉城县| 慈溪市| 台东县| 大兴区| 南岸区| 方正县| 广灵县| 连平县| 正镶白旗| 盐边县| 图木舒克市| 临泽县| 科技| 绥滨县|