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

首頁 > 系統 > Android > 正文

基于DownloadManager的簡單下載器編寫小結

2019-12-12 01:28:02
字體:
來源:轉載
供稿:網友

一直聽說過Android自帶的DownloadManager,只是拖延癥發作,一直沒有時間去研究研究,其實在很多項目開發中,都有一個功能是非常重要的,那就是應用的檢查更新了!基于DownloadManager,可以做一個輕量級的下載器,將下載任務交給系統去執行,減輕自身APP的壓力,何樂而不為呢?!

DownloadManager的基本使用姿勢

通過getSystemService進行實例化

DownloadManager downloadManager = (DownloadManager)context.getSystemService(Context.DOWNLOAD_SERVICE);構建下載請求DownloadManager.Request request = new DownloadManager.Request(Uri.parse("目標文件下載地址"));//設置目標文件夾,如果你想在系統的storage目錄下載一個testDownload/test/test.apkrequest.setDestinationInExternalPublicDir("testDownload", "test/test.apk");//設置下載所需的網絡環境,設置了移動網絡和WiFi環境下均能下載 request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);//通知欄設置//顯示在通知欄request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);

注意!!!如果選擇不顯示在通知欄,那么必須聲明以下權限

<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />

然后設置不可見

request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);

否則將會拋出一個securityException

//設置文件類型為apk類型,當downloadManager調用openFile時會喚起相應的程序request.setMimeType("application/cn.trinea.download.file"); //開始下載,得到一個唯一的downloadId,大有用處long downloadId = downloadManager.enqueue(request);

如何獲取下載的情況呢

private int[] getBytesAndStatus(long downloadId) {    //構建一個數組,存放已下載文件大小、總大小、下載狀態    int[] bytesAndStatus = new int[]{        -1, -1, 0    };    //通過構建下載請求時獲得的downloadId進行文件查詢    DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);    Cursor cursor = null;    try {      cursor = downloadManager.query(query);      if (cursor != null && cursor.moveToFirst()) {        //已經下載文件大小        bytesAndStatus[0] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));        //下載文件的總大小        bytesAndStatus[1] = cursor.getInt(cursor.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));        //下載狀態        bytesAndStatus[2] = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS));      }    } finally {      if (cursor != null) {        cursor.close();      }    }    return bytesAndStatus;  }

注冊監聽文件下載成功的廣播

private BroadcastReceiver downloadCompleteReceiver;downloadCompleteReceiver = new BroadcastReceiver() {      @Override      public void onReceive(Context context, Intent intent) {        //文件下載成功時         DownloadManager.Query query = new DownloadManager.Query();        //通過下載的id查找        query.setFilterById(downloadId);        Cursor c = downloadManager.query(query);        if (c.moveToFirst()) {            int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));            switch (status) {              //下載完成              case DownloadManager.STATUS_SUCCESSFUL:                 break;               }         }      }    };//注冊,這里只能攔截文件下載成功的廣播,并不能進行進度監聽,在適當的地方取消訂閱廣播context.registerReceiver(downloadCompleteReceiver,        new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

網上很多博客都是通過自定義ContentObserver獲取本地文件變化,其實可以另辟蹊徑,通過一個定時器間隔調用以上getBytesAndStatus(long downloadId)能達到同樣的效果,用Rxjava實現一個簡單的定時器

/** * 由于DownloadManager自身沒有提供實時進度的api,所以通過以下定時器獲取已下載的文件大小 */  private void updateProgress() {        //每隔0.5秒刷新一次進度,在適當的地方記得注銷 timeDisposable        Disposable timeDisposable = Observable.interval(500, TimeUnit.MILLISECONDS).subscribeOn(Schedulers.io())        .observeOn(AndroidSchedulers.mainThread()).subscribe(new DataConsumer<Long>() {          @Override          public void acceptData(@io.reactivex.annotations.NonNull Long aLong) {            int [ ] bytesAndStatus = getBytesAndStatus(downloadId);            //todo 在這里進行回調即可          }        });  }

了解完DownloadManager基本的使用方式,那么基于它來封裝一個簡單易用的下載器吧!

實現效果

 DownloadHelper.Builder builder = new DownloadHelper.Builder(this).title("下載通知")          .description("正在下載新版本V1.2.0")          .downloadUrl("http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk")          .fileSaveName("MobileAssistant_1.apk").fileSavePath("testDownload")          .notifyVisible(true)          .fileType(DownloadHelper.FileType.APK).apkInstallHint(true).onProgressListener(new DownloadHelper.OnDownloadProgressListener() {            @Override            public void onProgress(int downloadedSize, int totalSize) {              int progress =(int)((downloadedSize*1.0f/totalSize)*100);              Logger.d("progress=%d",progress);               //進度回調            }            @Override            public void onSuccess(Uri fileUri) {             //文件下載成功回調的Uri             }            @Override            public void onFail() {             //文件下載失敗              }            @Override            public void fileAlreadyExits(File file) {             //當你想重復下載同樣的文件時,本地檢測是否存在同樣的文件,進行回調                         }          });      DownloadHelper downloadHelper = builder.build();      //開始下載      downloadHelper.start();      //移除下載任務      downloadHelper.deleteDownloadFile();

源碼請到https://github.com/yuwenque/SimpleDownloadHelper.git

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 磴口县| 朝阳区| 德庆县| 吉安县| 天津市| 定陶县| 龙门县| 太仓市| 顺昌县| 苏尼特左旗| 化州市| 巨鹿县| 道孚县| 中江县| 女性| 嘉鱼县| 马鞍山市| 盐城市| 双牌县| 盐边县| 中西区| 囊谦县| 五华县| 行唐县| 普宁市| 海林市| 习水县| 青田县| 乌兰浩特市| 安徽省| 定安县| 苏尼特右旗| 旬阳县| 卓资县| 平遥县| 札达县| 焦作市| 禹城市| 和平区| 鄂尔多斯市| 江城|