1、問題概述 |
在android開發中,常常會使用到文件下載的功能,好比app版本更新等。在api level 9以後,android系統爲咱們提供了DownLoadManager類,這是android提供的系統服務,咱們經過這個服務完成文件下載。整個下載過程所有交給系統負責,不須要咱們過多的處理。android
經過API文檔,能夠看出DownLoadManager包含兩個內部類:web
DownLoadManager.Query:主要用於查詢下載信息。api
DownLoadManager.Request:主要用於發起一個下載請求。網絡
2、功能實現 |
首先讓咱們來了解一下DownLoadManager.Request,此類封裝了一個下載請求所須要的全部信息。經過構造函數咱們能夠初始化一個request對象,構造對象時須要傳入下載文件的地址。app
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("下載地址"));
構造完對象後,咱們能夠爲request設置一些屬性:ide
- addRequestHeader(String header,String value):添加網絡下載請求的http頭信息
- allowScanningByMediaScanner():用於設置是否容許本MediaScanner掃描。
- setAllowedNetworkTypes(int flags):設置用於下載時的網絡類型,默認任何網絡均可如下載,提供的網絡常量有:NETWORK_BLUETOOTH、NETWORK_MOBILE、NETWORK_WIFI。
- setAllowedOverRoaming(Boolean allowed):用於設置漫遊狀態下是否能夠下載
- setNotificationVisibility(int visibility):用於設置下載時時候在狀態欄顯示通知信息
- setTitle(CharSequence):設置Notification的title信息
- setDescription(CharSequence):設置Notification的message信息
- setDestinationInExternalFilesDir、setDestinationInExternalPublicDir、setDestinationUri等方法用於設置下載文件的存放路徑,注意若是將下載文件存放在默認路徑,那麼在空間不足的狀況下系統會將文件刪除,因此使用上述方法設置文件存放目錄是十分必要的。
建立Request對象的代碼以下:函數
DownloadManager.Request request = new DownloadManager.Request(Uri.parse("http://gdown.baidu.com/data/wisegame/55dc62995fe9ba82/jinritoutiao_448.apk")); //設置在什麼網絡狀況下進行下載 request.setAllowedNetworkTypes(Request.NETWORK_WIFI); //設置通知欄標題 request.setNotificationVisibility(Request.VISIBILITY_VISIBLE); request.setTitle("下載"); request.setDescription("今日頭條正在下載"); request.setAllowedOverRoaming(false); //設置文件存放目錄 request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS, "mydown");
取得系統服務後,調用downloadmanager對象的enqueue方法進行下載,此方法返回一個編號用於標示此下載任務:this
downManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);
id= downManager.enqueue(request);
若是想取消下載,則能夠調用remove方法完成,此方法能夠將下載任務和已經下載的文件同時刪除:spa
downManager.remove(id);
在文件下載完成時,咱們常常須要作一下後操做,好比apk,怎須要直接顯示安裝,那麼咱們如何監聽文件時候已經下載完成了呢?DownLoadManager在文件如今完成時會發送一個action爲ACTION_DOWNLOAD_COMPLETE的廣播,咱們只要註冊一個廣播接收器便可進行處理:3d
private class DownLoadCompleteReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)){ long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1); Toast.makeText(MainActivity.this, "編號:"+id+"的下載任務已經完成!", Toast.LENGTH_SHORT).show(); }else if(intent.getAction().equals(DownloadManager.ACTION_NOTIFICATION_CLICKED)){ Toast.makeText(MainActivity.this, "別瞎點!!!", Toast.LENGTH_SHORT).show(); } } }
DownManager會對全部的如今任務進行保存管理,那麼咱們如何獲取這些信息呢?這個時候就要用到DownManager.Query對象,經過此對象,咱們能夠查詢全部下載任務信息。
setFilterById(long... ids):根據任務編號查詢下載任務信息
setFilterByStatus(int flags):根據下載狀態查詢下載任務
具體使用方法以下:
private void queryDownTask(DownloadManager downManager,int status) { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterByStatus(status); Cursor cursor= downManager.query(query); while(cursor.moveToNext()){ String downId= cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_ID)); String title = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TITLE)); String address = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI)); //String statuss = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)); String size= cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR)); String sizeTotal = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_TOTAL_SIZE_BYTES)); Map<String, String> map = new HashMap<String, String>(); map.put("downid", downId); map.put("title", title); map.put("address", address); map.put("status", sizeTotal+":"+size); this.data.add(map); } cursor.close(); }
具體能夠查看哪些信息,能夠查看DownLoadManger下的Column_*常量信息。
3、源碼下載 |
想要親自體驗效果的同窗,能夠下載原工程,直接運行查看!