前言

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

效果图

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

工作流程图

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

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的更多相关文章

  1. Android中实现静态的默认安装和卸载应用

    近期好长时间都没有写blog了,主要是由于近期工作上的事以及下载Android源代码的事耽误的(下载源代码这件事会在兴许的blog中写道.这个真的非常有意义呀~~),那么今天来写点什么呢?基本的灵感来 ...

  2. Android中的多线程断点下载

    首先来看一下多线程下载的原理.多线程下载就是将同一个网络上的原始文件根据线程个数分成均等份,然后每个单独的线程下载对应的一部分,然后再将下载好的文件按照原始文件的顺序"拼接"起来就 ...

  3. android中广告轮播图总结

    功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,set ...

  4. Android项目第一天,下载安装Android Studio和“我的第一个安卓项目”

    一.AS的下载我是在AS官方网站进行下载的最新版本,如图所示 二.AS的安装过程 点击你下载的安装包安装即可,傻瓜式一站到底. 到这一步时选择第二个按钮, 随后出现如下界面 这个窗口是提示我们设置代理 ...

  5. Android学习记录(6)—将java中的多线程下载移植到Android中(即多线程下载在Android中的使用)③

    在这一节中,我们就来讲多线程下载以及断点续传在android中怎么使用,前两节是为本节做准备的,没有看前两节的同学,最好看完前面的两篇文章再来看这篇.其实在android端的应用和java基本上是差不 ...

  6. Apache日志轮询Cronolog安装及简单用法

    安装日志轮询工具cronolog: [root@bqh- tools]# tar xf cronolog-.tar.gz [root@bqh- tools]# cd cronolog- [root@b ...

  7. 详细解读Android中的搜索框(二)—— Search Dialog

    Search Dialog是提供搜索的控件之一,还有一个是上次小例子给出的searchView,关于SearchView的东西后面会说到.本次先从Search Dialog说起,让大家慢慢理解andr ...

  8. Android程序版本更新--通知栏更新下载安装(转)

    Android应用检查版本更新后,在通知栏下载,更新下载进度,下载完成自动安装,效果图如下: 检查当前版本号 AndroidManifest文件中的versionCode用来标识版本,在服务器放一个新 ...

  9. android studio 3.1.4下载安装配置(附旧版本下载地址)

    windows下安装android studio.当前时间2018年9月. 最新版本的android studio3.2.0-release出来了,拥有许多新的特性 可能我是一个业余的android开 ...

随机推荐

  1. nyoj 53-不高兴的小明 (遍历)

    53-不高兴的小明 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:28 submit:89 题目描述:    小明又出问题了.妈妈认为聪明的小明应该 ...

  2. PHP是怎样重载的

    PHP 的重载跟 Java 的重载不同,不可混为一谈.Java 允许类中存在多个同名函数,每个函数的参数不相同,而 PHP 中只允许存在一个同名函数.例如,Java 的构造函数可以有多个,PHP 的构 ...

  3. 【NHOI2018】字符串变换

    [题目描述] 给你一个全部由大小写字母组成的字符串,你每次可以将一个小写字母变换成对应的大写字母,或把一个大写字母变换成对应的小写字母.请问:至少要进行多少次变换才可以使整个字符串全部由大写字母或全部 ...

  4. python核心编程笔记(转)

    解释器options: 1.1 –d   提供调试输出 1.2 –O   生成优化的字节码(生成.pyo文件) 1.3 –S   不导入site模块以在启动时查找python路径 1.4 –v   冗 ...

  5. Linux -- 信号发送实现

    信号是Linux系统响应某些条件而产生的一个事件,接收该信号的进程会响应地采取一些行动   signal 定义 在进程控制块 (PCB Process Control Block) 的数据结构中,存在 ...

  6. Mybatis整合spring(适合小白)

    目录 1.整合思路 2.整合需要的jar包 3.整合的步骤 4.Dao的开发的两种实现方式 6.Dao的开发的实现方式总结图 @ Mybatis整合spring其实就是SSM框架中SM的整合集成. 1 ...

  7. 《手把手教你》系列练习篇之7-python+ selenium自动化测试 -压轴篇(详细教程)

    1. 简介 “压轴”原本是戏曲名词,指一场折子戏演出的倒数第二个剧目.在现代社会中有很多应用,比如“压轴戏”,但压轴也是人们知识的一个盲区.“压轴”本意是指倒数第二个节目,而不是人们常说的倒数第一个, ...

  8. 切换控制器的三种手段push modal 切换window的rootViewController

  9. javascript获取当前时间CurentTime

    function CurentTime(){ var now = new Date(); var year = now.getFullYear(); //年 var month = now.getMo ...

  10. html元素是否包含另外一个元素,以及classList属性

    如何判断一个元素A包含了元素B呢?如果不用contains方法的话,如何做呢? 腾讯面试的时候也出了这道题啊,当时没看dom的知识,所以一抹黑哦... 那就判断B是否为A的child喽,那也就是A是B ...