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

Android开发之自带下载器DownloadManager的使用示例代码

程序员文章站 2023-12-04 15:35:26
android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新app的情形。其基本思路是根据本地的app版本号和服务器的版本号进行比较,如果服务器版本较新,再进行...

android 开发中,经常有从服务器下载数据的需求出现,尤其是在线更新app的情形。其基本思路是根据本地的app版本号和服务器的版本号进行比较,如果服务器版本较新,再进行提示然后下载apk最后进行安装。这种需求解决方案有很多,第三方的网络框架基本都有这个功能。

android自带的downloadmanager是一个很好的下载文件的工具。该类在api level 9之后出现,它已经帮我们处理了下载失败、重新下载等功能,整个下载过程全部交给系统负责,不需要我们过多的处理,非常的nice。关键的是用起来也很简单,很爽,稍微封装一下就可以几句话搞定下载。

下面以一个简单案例来实现从服务器下载一个apk文件并进行安装。

1、打开本地tomcat服务器,放入一个apk文件

Android开发之自带下载器DownloadManager的使用示例代码

2、开启tomcat,然后确保能从浏览器下载

 Android开发之自带下载器DownloadManager的使用示例代码

3、编写downloadmanager工具类,代码注释很详细

public class downloadutils {
  //下载器
  private downloadmanager downloadmanager;
  //上下文
  private context mcontext;
  //下载的id
  private long downloadid;
  public downloadutils(context context){
    this.mcontext = context;
  }

  //下载apk
  public void downloadapk(string url, string name) {

    //创建下载任务
    request request = new request(uri.parse(url));
    //移动网络情况下是否允许漫游
    request.setallowedoverroaming(false);

    //在通知栏中显示,默认就是显示的
    request.setnotificationvisibility(downloadmanager.request.visibility_visible);
    request.settitle("新版本apk");
    request.setdescription("apk downloading");
    request.setvisibleindownloadsui(true);

    //设置下载的路径
    request.setdestinationinexternalpublicdir(environment.getexternalstoragedirectory().getabsolutepath() , name);

    //获取downloadmanager
    downloadmanager = (downloadmanager) mcontext.getsystemservice(context.download_service);
    //将下载请求加入下载队列,加入下载队列后会给该任务返回一个long型的id,通过该id可以取消任务,重启任务、获取下载的文件等等
    downloadid = 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) {
      checkstatus();
    }
  };


  //检查下载状态
  private void checkstatus() {
    query query = new query();
    //通过下载的id查找
    query.setfilterbyid(downloadid);
    cursor c = downloadmanager.query(query);
    if (c.movetofirst()) {
      int status = c.getint(c.getcolumnindex(downloadmanager.column_status));
      switch (status) {
         //下载暂停
        case downloadmanager.status_paused:
          break;
        //下载延迟
        case downloadmanager.status_pending:
          break;
        //正在下载
        case downloadmanager.status_running:
          break;
        //下载完成
        case downloadmanager.status_successful:
          //下载完成安装apk
          installapk();
          break;
        //下载失败
        case downloadmanager.status_failed:
          toast.maketext(mcontext, "下载失败", toast.length_short).show();
          break;
      }
    }
  }

  //下载到本地后执行安装
  private void installapk() {
    //获取下载文件的uri
    uri downloadfileuri = downloadmanager.geturifordownloadedfile(downloadid);
    if (downloadfileuri != null) {
      intent intent= new intent(intent.action_view);
      intent.setdataandtype(downloadfileuri, "application/vnd.android.package-archive");
      intent.addflags(intent.flag_activity_new_task);
      mcontext.startactivity(intent);
    }
  }

}

4、编写activity代码初始化工具类,然后下载

public class mainactivity extends appcompatactivity {
  private downloadutils downloadutils;
  @override
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.activity_main);

    downloadutils =  new downloadutils(mainactivity.this); 
    downloadutils.downloadapk("http://192.168.1.104:8080/xxx.apk", "xxx.apk");

  }
}

5、配置权限

<!--在sdcard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.mount_unmount_filesystems"/>
<!-- 往sdcard写入数据权限 -->
<uses-permission android:name="android.permission.write_external_storage"/>
<!-- 从sdcard读取数据权限 -->
<uses-permission android:name="android.permission.read_external_storage"/>
<!-- 访问网络权限 -->
<uses-permission android:name="android.permission.internet"/>

6、运行结果

运行以后会去下载服务器的apk,通知栏也会有相应的通知。当下载完毕以后,会弹出安装界面。

通知栏

Android开发之自带下载器DownloadManager的使用示例代码

主界面

Android开发之自带下载器DownloadManager的使用示例代码

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