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_BLUETOOTHNETWORK_MOBILENETWORK_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<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_*常量信息。

三、源碼下載

  想要親自體驗效果的同學,可以下載原工程,直接運行查看!

 

作者: 傑瑞教育
出處: http://www.cnblogs.com/jerehedu/ 
本文版權歸煙台傑瑞教育科技有限公司和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM