美文网首页弹窗
Android中实现轮询下载安装应用的Dialog

Android中实现轮询下载安装应用的Dialog

作者: GiftedCat | 来源:发表于2019-12-17 15:03 被阅读0次

    前言

    因为有涉及到静默安装,主要是针对已经root的设备,应需求,是在ARM的主板上开发的,所以对于常规手机仅能做到轮询下载,做不到静默安装。

    效果图

    image image

    用的鸿洋大神的百分比布局,各个分辨率都完美适配,小case

    工作流程图

    还是得上一下流程图,方便理解,对自己也是一种总结

    image

    Dialog内部实现代码解析

    1.重写dialog的show函数,入参加一个字符串的列表,这样就可以获取到需要下载的apk的地址集合了

        /**
         * 获取需要下载的文件地址,显示弹窗
         */
        public void show(List<String> apkUrls) {
            show();
            content = "";
            this.apkUrls = apkUrls;
            //开始现在第一个app
            downloadApp(0);
        }
    

    2.判断索引index是否大于list的size,,超出了则说明已经全部下载完成了,可以结束轮询,关闭dialog了

        if (index == apkUrls.size()) {
            //index已超出范围,说明说有app已经下载完成
            setContent("\n全部下载完成!" + index + "/" + apkUrls.size() + "(3秒后关闭)");
            txt_dec.postDelayed(new Runnable() {
                @Override
                public void run() {
                    dismiss();
                }
            }, 3000);
            return;
        }
    

    3.判断下载地址不为空,之后根据下载地址创建一个本地文件,并删除本地原有的同名文件(防止直接跳过了)

            String apkUrl = apkUrls.get(index);
            if (TextUtils.isEmpty(apkUrl)) {
                //如果apk的地址为空,则跳过,开始下载下一个
                downNextApp(index);
                return;
            }
            final String name = UrlUtils.getUrlFileName(apkUrl);
            final String localPath = Environment.getExternalStoragePublicDirectory("") + "/Download/" + name + ".apk";
            //如果已有同名文件将其删除
            deleteFile(localPath);
    

    4.调用HttpTools的下载函数,在下载完成回调内执行静默安装,并开始下一次轮询

            httpTools.download(apkUrl, localPath, true, new HttpCallback());
    

    文件下载完成后回调函数内实现静默安装,并开始下一次轮询

            boolean installStatus = false;
            if (DeviceUtil.install(localPath)) {
                //安装成功
                installStatus = true;
            } else {
                //安装失败
                installStatus = false;
            }
            //完成后删除文件
            deleteFile(localPath);
            if (listener != null) {
                //回调给使用者
                listener.downloadFinish(installStatus, localPath);
            }
    

    使用Dialog

    1.初始化Dialog

            DownLoadAppDialog downLoadAppDialog = new DownLoadAppDialog(mContext);
    

    2.增加下载完成的监听回调(可省略)

            downLoadAppDialog.setOnDownLoadListener(new DownLoadAppListener() {
                @Override
                public void downloadFinish(boolean installStatus, String path) {
                    if (installStatus){
                        //安装成功
                        LogUtil.e( path + "安装成功");
                    }else {
                        //安装失败
                        LogUtil.e( path + "安装失败");
                    }
                }
            });
    

    3.在需要使用的时候,调用我们自己写的show函数

    downLoadAppDialog.show(apkUrls);
    

    源码

    最后再贴上源码:https://github.com/Giftedcat/DownLoadAppDialog

    相关文章

      网友评论

        本文标题:Android中实现轮询下载安装应用的Dialog

        本文链接:https://www.haomeiwen.com/subject/zgfsnctx.html