僅4行代碼實現(xiàn)Android快速文件下載
寫在前面的廢話
下載文件,幾乎是所有APP都會用到的功能!算了,還是不廢話了,直接開寫吧。。。
簡單使用
完成一個下載任務(wù)只需要4行代碼,什么斷點續(xù)傳,大文件下載,通知欄進度顯示….都不需要你操心。
//創(chuàng)建下載任務(wù),downloadUrl就是下載鏈接 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl)); //指定下載路徑和下載文件名 request.setDestinationInExternalPublicDir("/download/", fileName); //獲取下載管理器 DownloadManager downloadManager= (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); //將下載任務(wù)加入下載隊列,否則不會進行下載 downloadManager.enqueue(request);
高級用法
----通過上面的代碼大家也看出來了,我們使用的是系統(tǒng)提供的下載管理器進行下載,從API 9就開始支持了,所以不用擔(dān)心在兼容問題
----既然是系統(tǒng)提供的,那么肯定還有更加強大的用法,文章繼續(xù)
讓我們看DownloadManager的源碼,提供了這么多方法
DownloadManager的方法
DownloadManager.Request的方法
方法差不多就這些,已經(jīng)比較全了,可以滿足我們絕大部分的使用場景。
實際使用
接下來我們就以APP應(yīng)用內(nèi)更新為例,講一下這些方法的使用
1.首先我們梳理下APP應(yīng)用內(nèi)更新的邏輯
APP應(yīng)用內(nèi)更新
2.接下來看具體實現(xiàn),上代碼
//使用系統(tǒng)下載器下載 private void downloadAPK(String versionUrl, String versionName) { //創(chuàng)建下載任務(wù) DownloadManager.Request request = new DownloadManager.Request(Uri.parse(versionUrl)); request.setAllowedOverRoaming(false);//漫游網(wǎng)絡(luò)是否可以下載 //設(shè)置文件類型,可以在下載結(jié)束后自動打開該文件 MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton(); String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(versionUrl)); request.setMimeType(mimeString); //在通知欄中顯示,默認(rèn)就是顯示的 request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE); request.setVisibleInDownloadsUi(true); //sdcard的目錄下的download文件夾,必須設(shè)置 request.setDestinationInExternalPublicDir("/download/", versionName); //request.setDestinationInExternalFilesDir(),也可以自己制定下載路徑 //將下載請求加入下載隊列 downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); //加入下載隊列后會給該任務(wù)返回一個long型的id, //通過該id可以取消任務(wù),重啟任務(wù)等等,看上面源碼中框起來的方法 mTaskId = downloadManager.enqueue(request); //注冊廣播接收者,監(jiān)聽下載狀態(tài) mContext.registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); }
接下來是廣播接收器
//廣播接受者,接收下載狀態(tài) private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { checkDownloadStatus();//檢查下載狀態(tài) } };
檢查下載狀態(tài)
//檢查下載狀態(tài) private void checkDownloadStatus() { DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(mTaskId);//篩選下載任務(wù),傳入任務(wù)ID,可變參數(shù) Cursor c = downloadManager.query(query); if (c.moveToFirst()) { int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); switch (status) { case DownloadManager.STATUS_PAUSED: MLog.i(">>>下載暫停"); case DownloadManager.STATUS_PENDING: MLog.i(">>>下載延遲"); case DownloadManager.STATUS_RUNNING: MLog.i(">>>正在下載"); break; case DownloadManager.STATUS_SUCCESSFUL MLog.i(">>>下載完成"); //下載完成安裝APK //downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + File.separator + versionName; installAPK(new File(downloadPath)); break; case DownloadManager.STATUS_FAILED: MLog.i(">>>下載失敗"); break; } } }
安裝APK
//下載到本地后執(zhí)行安裝 protected void installAPK(File file) { if (!file.exists()) return; Intent intent = new Intent(Intent.ACTION_VIEW); Uri uri = Uri.parse("file://" + file.toString()); intent.setDataAndType(uri, "application/vnd.android.package-archive"); //在服務(wù)中開啟activity必須設(shè)置flag,后面解釋 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); mContext.startActivity(intent); }
到此就完成了應(yīng)用內(nèi)更新APP的代碼,但是有一些坑需要注意!
希望你可以看到最后這幾句,不然你也會被坑的!
1.雖然下載什么的不需要自己操心了,但是建議還是將整個上面四段代碼放在Service中執(zhí)行,因為放在Activity中時,當(dāng)用戶按home鍵后,即使下載完了,也不會彈出安裝界面
2.建議使用startService的方式啟動Service,這樣不會與Activity生命周期綁定,保證下載完后能順利安裝。
3.Service使用完后要及時地停掉!
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Android_性能優(yōu)化之ViewPager加載成百上千高清大圖oom解決方案
這篇文章主要介紹了詳解Android_性能優(yōu)化之ViewPager加載成百上千高清大圖oom解決方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下。2016-12-12Android使用AudioManager修改系統(tǒng)音量的方法
這篇文章主要介紹了Android使用AudioManager修改系統(tǒng)音量的方法,結(jié)合實例形式分析了AudioManager調(diào)節(jié)音量的常用方法及相關(guān)使用技巧,需要的朋友可以參考下2016-08-08Flutter打包apk報錯Your?app?isn't?using?AndroidX解決
這篇文章主要為大家介紹了Flutter打包apk報錯Your?app?isn't?using?AndroidX解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-08-08圖文講解Android的ImageView類中的ScaleType屬性設(shè)置
這篇文章主要介紹了Android的ImageView類中的ScaleType屬性設(shè)置,同時文中還講了實現(xiàn)圖片寬度100%ImageView寬度且高度按比例自動伸縮的方法,需要的朋友可以參考下2016-03-03