当前位置: 移动技术网 > 移动技术>移动开发>Android > 仅4行代码实现Android快速文件下载

仅4行代码实现Android快速文件下载

2019年07月24日  | 移动技术网移动技术  | 我要评论

写在前面的废话 

下载文件,几乎是所有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使用完后要及时地停掉!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网