欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2024-03-05 12:20:36
写在前面的废话  下载文件,几乎是所有app都会用到的功能!算了,还是不废话了,直接开写吧。。。  简单使用  完成一个下载...

写在前面的废话 

下载文件,几乎是所有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的源码,提供了这么多方法 

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

downloadmanager的方法 

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

downloadmanager.request的方法

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

实际使用
接下来我们就以app应用内更新为例,讲一下这些方法的使用 

1.首先我们梳理下app应用内更新的逻辑

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

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使用完后要及时地停掉!

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