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("下载地址"));

让我们看看DownloadManager的源码,提供了这么多方法

Android基于自带的DownloadManager实现下载功能_第1张图片

  

Android基于自带的DownloadManager实现下载功能_第2张图片

方法差不多就这些,已经比较全了,可以满足我们绝大部分的使用场景。

实际使用

接下来我们就以APP应用内更新为例,讲一下这些方法的使用
1.首先我们梳理下APP应用内更新的逻辑

Android基于自带的DownloadManager实现下载功能_第3张图片

接下来看具体实现,上代码

  private void downLoadApk() {
        //创建request对象
        DownloadManager.Request request=new DownloadManager.Request(Uri.parse("http://gdown.baidu.com/data/wisegame/55dc62995fe9ba82/jinritoutiao_448.apk"));
        //设置什么网络情况下可以下载
        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI);
        //设置通知栏的标题
        request.setTitle("下载");
        //设置通知栏的message
        request.setDescription("今日头条正在下载.....");
        //设置漫游状态下是否可以下载
        request.setAllowedOverRoaming(false);
        //设置文件存放目录
        request.setDestinationInExternalFilesDir(this, Environment.DIRECTORY_DOWNLOADS,"update.apk");
        //获取系统服务
        downloadManager= (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
        //进行下载
        id = downloadManager.enqueue(request);
    }

Android基于自带的DownloadManager实现下载功能_第4张图片

 

如果想取消下载,则可以调用remove方法完成,此方法可以将下载任务和已经下载的文件同时删除:

downManager.remove(id);

在文件下载完成时,我们经常需要做下载后操作,比如apk,需要直接显示安装,那么我们如何监听文件已经下载完成了 呢?DownLoadManager在文件完成时会发送一个action为ACTION_DOWNLOAD_COMPLETE的广播,我们只要注册一 个广播接收器即可进行处理:

/**
 * Created by YuShuangPing on 2018/9/4.
 */
public class DownLoadCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
   if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())){
       //在广播中取出下载任务的id
       long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
       Toast.makeText(context, "编号:"+id+"的下载任务已经完成!", Toast.LENGTH_SHORT).show();
       DownloadManager.Query query=new DownloadManager.Query();
       DownloadManager dm= (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
       query.setFilterById(id);
       Cursor c = dm.query(query);
      if (c!=null){
          try {
              if (c.moveToFirst()){
                  //获取文件下载路径
                   String filename= c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
                  int status = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS));
              if (status==DownloadManager.STATUS_SUCCESSFUL){
                  //启动更新
                  Uri uri = Uri.fromFile(new File(filename));
                  if (uri!=null){
                          Intent install=new Intent(Intent.ACTION_VIEW);
                          install.setDataAndType(uri,"application/vnd.android.package-archive");
                          install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                          context.startActivity(install);
                  }
              }
              }
          }catch (Exception e){
              e.printStackTrace();
              return;
          }finally {
              c.close();
          }

      }
   }
    }
}

在清单文件中注册广播:

 
            
                
            
        

等下载完时就会自动跳到安装界面:

Android基于自带的DownloadManager实现下载功能_第5张图片

 

你可能感兴趣的:(android进阶)