Android中文件下载,app更新,我们一般利用的都是 Retrofit或者 Okhttp等实现,但其实Android 早在API 9之后,就为我们提供了DownLoadManager,这是Android提供的系统服务,通过这个服务下载文件,整个过程全部交给了系统负责,免去了我们别的操作。

下面我们就来实地演示一下操作。

测试api sdk28, Android Studio3.4 小米5s Plus

代码如下:

//定义一个成功接口

public interface IDownloadlister {    void success(Uri uri);}

工具类,重要的代码我已经移动上来。

/** * Created by Petterp * on 2019-10-26 * Function: 文件下载工具类 */public class DownloadUtils {    public void download() {        IntentFilter filter = new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE);        //创建下载任务,url即任务链接        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));        //指定下载路径及文件名        request.setDestinationInExternalPublicDir(FILE_URI, fileName);        //获取下载管理器        final DownloadManager downloadManager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);        //一些配置        //允许移动网络与WIFI下载        request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE | DownloadManager.Request.NETWORK_WIFI);        //是否在通知栏显示下载进度        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);        //设置可见及可管理        /*注意,Android Q之后不推荐使用*/        request.setVisibleInDownloadsUi(true);        //将任务加入下载队列        assert downloadManager != null;        final long id = downloadManager.enqueue(request);        BroadcastReceiver receiver = new BroadcastReceiver() {            @Override            public void onReceive(Context context, Intent intent) {                //获取下载id                long myDwonloadID = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);                if (myDwonloadID == id) {                    //获取下载uri                    Uri uri = downloadManager.getUriForDownloadedFile(myDwonloadID);                    lister.success(uri);                }            }        };        if (context instanceof Activity) {            Activity activity = (Activity) context;            activity.registerReceiver(receiver, filter);        }    }        //测试url,下载链接    private String url = "http://qn.yingyonghui.com/apk/653732" +            "5/c1d876442e38f2555" +            "d85c55a1d8e95b7?sign=a36530f5c08ffbb5d9e" +            "53c2d50346eb7&t=5db45f8d&attname=c1d876442e" +            "38f2555d85c55a1d8e95b7.apk";    //加.好处是默认隐藏路径    private final String FILE_URI = "/.测试路径/";    private IDownloadlister lister = null;  //文件名    private String fileName = "test";  //Context    private Context context;    public static DownloadUtils builder() {        return new DownloadUtils();    }    public DownloadUtils setUrl(String url) {        this.url = url;        return this;    }    public DownloadUtils setLister(IDownloadlister lister) {        this.lister = lister;        return this;    }    public DownloadUtils setFileName(String fileName) {        this.fileName = fileName;        return this;    }    public DownloadUtils setContext(Context context) {        this.context = context;        return this;    }}

使用时,这里下载了个app

DownloadUtils.builder()        .setContext(this)        .setLister(new IDownloadlister() {            @Override            public void success(Uri uri) {                               Intent install = new Intent(Intent.ACTION_VIEW);                install.setDataAndType(uri, "application/vnd.android.package-archive");                install.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);                startActivity(install);            }        })        .download();

最后记得给权限啊,切记。


很简单吧,关于更多的操作,比如下载进度,DownloadManager并没有提供具体方法,不过我们可以通过定时获取已下载大小,然后计算相应的进度值。

更多相关文章

  1. Android(安卓)GPS获取当前经纬度坐标
  2. android获取系统标准时区的时间
  3. Android(安卓)-- 多线程下载
  4. Android源码下载并绑定到Eclipse中
  5. Android的Root原理
  6. Android(安卓)Studio 查看不到SDK源码解决办法
  7. Android应用开发提高系列(5)――Android动态加载(下)――加载已安装A
  8. Android7.0文件读写(获取拍照结果)笔记
  9. Pycharm安装PyQt5的详细教程

随机推荐

  1. Why printing from your iPad or Android
  2. Android运行虚拟机报错Execution failed
  3. Android(安卓)Post方法请求URL 迭代器
  4. 《Android系统学习》第五章:编译Android的
  5. Android操作SD卡文件
  6. 改变亮度Brightness
  7. android 修改wifi信号强度
  8. Android(安卓)四大组件之 Service
  9. android(17)_数据存储与访问_SQLite数据
  10. Android使用Volloy进行JsonObjectRequest