Android中的檔案下載——DownLoadManager

來源:互聯網
上載者:User

Android中的檔案下載——DownLoadManager

一、問題概述

  在android開發中,經常會使用到檔案下載的功能,比如app版本更新等。在api level 9之後,android系統為我們提供了DownLoadManager類,這是android提供的系統服務,我們通過這個服務完成檔案下載。整個下載過程全部交給系統負責,不需要我們過多的處理。

  通過API文檔,可以看出DownLoadManager包含兩個內部類:

  DownLoadManager.Query:主要用於查詢下載資訊。

  DownLoadManager.Request:主要用於發起一個下載請求。

二、功能實現

  首先讓我們來瞭解一下DownLoadManager.Request,此類封裝了一個下載請求所需要的所有資訊。通過建構函式我們可以初始化一個request對象,構造對象時需要傳入下載檔案的地址。

DownloadManager.Request request = new DownloadManager.Request(Uri.parse());

  構造完對象後,我們可以為request設定一些屬性:

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方法進行下載,此方法返回一個編號用於標示此下載任務:

downManager = (DownloadManager)getSystemService(Context.DOWNLOAD_SERVICE);id= downManager.enqueue(request);

  如果想取消下載,則可以調用remove方法完成,此方法可以將下載任務和已經下載的檔案同時刪除:

downManager.remove(id);

  在檔案下載完成時,我們經常需要做一下後操作,比如apk,怎需要直接顯示安裝,那麼我們如何監聽檔案時候已經下載完成了呢?DownLoadManager在檔案現在完成時會發送一個action為ACTION_DOWNLOAD_COMPLETE的廣播,我們只要註冊一個廣播接收器即可進行處理:

    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 map = new HashMap();            map.put(downid, downId);            map.put(title, title);            map.put(address, address);            map.put(status, sizeTotal+:+size);            this.data.add(map);        }        cursor.close();    }

 

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.