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

首頁 > 系統 > Android > 正文

僅4行代碼實現Android快速文件下載

2019-12-12 06:03:40
字體:
來源:轉載
供稿:網友

寫在前面的廢話 

下載文件,幾乎是所有APP都會用到的功能!算了,還是不廢話了,直接開寫吧。。。 

簡單使用

 完成一個下載任務只需要4行代碼,什么斷點續傳,大文件下載,通知欄進度顯示….都不需要你操心。

 //創建下載任務,downloadUrl就是下載鏈接DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downloadUrl));//指定下載路徑和下載文件名request.setDestinationInExternalPublicDir("/download/", fileName);//獲取下載管理器DownloadManager downloadManager= (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);//將下載任務加入下載隊列,否則不會進行下載downloadManager.enqueue(request); 

高級用法
----通過上面的代碼大家也看出來了,我們使用的是系統提供的下載管理器進行下載,從API 9就開始支持了,所以不用擔心在兼容問題
----既然是系統提供的,那么肯定還有更加強大的用法,文章繼續 

讓我們看DownloadManager的源碼,提供了這么多方法 

DownloadManager的方法 

DownloadManager.Request的方法

方法差不多就這些,已經比較全了,可以滿足我們絕大部分的使用場景。

實際使用
接下來我們就以APP應用內更新為例,講一下這些方法的使用 

1.首先我們梳理下APP應用內更新的邏輯


APP應用內更新 

2.接下來看具體實現,上代碼

 //使用系統下載器下載private void downloadAPK(String versionUrl, String versionName) {    //創建下載任務    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(versionUrl));    request.setAllowedOverRoaming(false);//漫游網絡是否可以下載    //設置文件類型,可以在下載結束后自動打開該文件    MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();    String mimeString = mimeTypeMap.getMimeTypeFromExtension(MimeTypeMap.getFileExtensionFromUrl(versionUrl));    request.setMimeType(mimeString);    //在通知欄中顯示,默認就是顯示的    request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE);    request.setVisibleInDownloadsUi(true);    //sdcard的目錄下的download文件夾,必須設置    request.setDestinationInExternalPublicDir("/download/", versionName);    //request.setDestinationInExternalFilesDir(),也可以自己制定下載路徑    //將下載請求加入下載隊列    downloadManager = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE);    //加入下載隊列后會給該任務返回一個long型的id,    //通過該id可以取消任務,重啟任務等等,看上面源碼中框起來的方法    mTaskId = downloadManager.enqueue(request);    //注冊廣播接收者,監聽下載狀態    mContext.registerReceiver(receiver,        new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));  } 

接下來是廣播接收器

   //廣播接受者,接收下載狀態  private BroadcastReceiver receiver = new BroadcastReceiver() {    @Override    public void onReceive(Context context, Intent intent) {      checkDownloadStatus();//檢查下載狀態    }  }; 

檢查下載狀態

 //檢查下載狀態  private void checkDownloadStatus() {    DownloadManager.Query query = new DownloadManager.Query();    query.setFilterById(mTaskId);//篩選下載任務,傳入任務ID,可變參數    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

   //下載到本地后執行安裝  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");    //在服務中開啟activity必須設置flag,后面解釋    intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);    mContext.startActivity(intent);  } 

到此就完成了應用內更新APP的代碼,但是有一些坑需要注意! 

希望你可以看到最后這幾句,不然你也會被坑的!
 1.雖然下載什么的不需要自己操心了,但是建議還是將整個上面四段代碼放在Service中執行,因為放在Activity中時,當用戶按home鍵后,即使下載完了,也不會彈出安裝界面 
2.建議使用startService的方式啟動Service,這樣不會與Activity生命周期綁定,保證下載完后能順利安裝。 
3.Service使用完后要及時地停掉!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 南川市| 长沙县| 迁安市| 凤冈县| 巩留县| 苏尼特左旗| 互助| 黎平县| 隆昌县| 寿宁县| 九寨沟县| 福海县| 中江县| 吴旗县| 苍山县| 嘉善县| 买车| 桐梓县| 伊金霍洛旗| 陇川县| 浦城县| 通道| 湾仔区| 阳山县| 正定县| 民权县| 本溪| 奉贤区| 佛冈县| 桦南县| 阜宁县| SHOW| 天津市| 康乐县| 沐川县| 神池县| 上饶市| 嘉义市| 交城县| 榆树市| 永新县|