Android客户端apk自动检测更新自动下载自动安装的实现方法

2023-11-20

改进了一个可以检测版本更新自动下载自动安装的客户端升级方案。

在下载之前删除之前的历史下载文件,减少垃圾数据。

先给出核心类

public class DownloadService extends Service {
    private DownloadManager mDownloadManager;
    private long enqueue;
    private BroadcastReceiver receiver;
    private  static final String APK_URL= IPAddress.DEFAULT_IP+"/portrait/app-youni.apk";
//    private  static final String APK_NAME="youni.apk";
    private  static final String APK_NAME="youni_"+ System.currentTimeMillis()+"_.apk";

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        DebugLog.v("onBind");
        return null;
    }
    @Override
    public void onCreate() {
        DebugLog.v("onCreate");
        super.onCreate();
        /*删除以前下载的安装包*/
        RecursionDeleteFile(new File(Environment.getExternalStorageDirectory() + "/download/youni/"));
    }

    @Override
    public void onStart(Intent intent, int startId) {
        DebugLog.v("onStart");
        super.onStart(intent, startId);
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        DebugLog.v("onStartCommand");
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                intent = new Intent(Intent.ACTION_VIEW);
                intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.setDataAndType(Uri.fromFile(new File(Environment.getExternalStorageDirectory() + "/download/youni/"+APK_NAME)),
                        "application/vnd.android.package-archive");
                startActivity(intent);
                stopSelf();
            }
        };
        registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
        startDownload();
        return Service.START_STICKY;
    }

    @Override
    public void onDestroy() {
        DebugLog.v("onDestroy");
        unregisterReceiver(receiver);
        super.onDestroy();
    }

    private void startDownload() {
        mDownloadManager = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
        DownloadManager.Request request = new DownloadManager.Request(Uri.parse(APK_URL));
        request.setDescription("正在为您下载 友你 App的最新版本");
        request.setMimeType("application/vnd.android.package-archive");
        request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS+"/youni", APK_NAME);
        enqueue = mDownloadManager.enqueue(request);
    }
    /**
     * 递归删除文件和文件夹
     * @param file    要删除的根目录
     */
    public void RecursionDeleteFile(File file){
        if(file.isFile()){
            file.delete();
            return;
        }
        if(file.isDirectory()){
            File[] childFile = file.listFiles();
            if(childFile == null || childFile.length == 0){
                file.delete();
                return;
            }
            for(File f : childFile){
                RecursionDeleteFile(f);
            }
            file.delete();
        }
    }
}
然后再检测到服务器有新版本后,弹出对话框,询问用户是否下载

  /*系统提示对话框*/
new AlertDialog.Builder(NewMainActivity.this).setTitle("操作提示")//设置对话框标题
        .setMessage("检测到最新版本,是否要升级?")//设置显示的内容
        .setPositiveButton("后台下载",new DialogInterface.OnClickListener() {//添加确定按钮
            @Override
            public void onClick(DialogInterface dialog, int which) {//确定按钮的响应事件
                startService(new Intent(getApplicationContext(), DownloadService.class));
            }
        }).setNegativeButton("下次再说",new DialogInterface.OnClickListener() {//添加返回按钮
    @Override
    public void onClick(DialogInterface dialog, int which) {//响应事件

    }
}).show();//在按键响应事件中显示此对话框
下载后就可以自动安装了


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android客户端apk自动检测更新自动下载自动安装的实现方法 的相关文章

  • 过度绘制和渲染

    最近在解过度绘制的问题单时 对过度绘制和渲染进行了简要的学习 UI优化和UI渲染 UI 优化究竟指的是什么呢 应该包含两个方面 一个是效率的提升 我们可以非常高效地把 UI 的设计图转化成应用界面 在不同并且保证 UI 界面尺寸和分辨率的手
  • 【Android开发】toast提示

    什么是Toast 在屏幕下方浮现出一个窗口 显示一段时间后又消失 这个可视化组件叫做 Toast 它主要用于提示用户某种事件发生了 如何在添加Toast 最关键的是在事件处理逻辑中加两条语句 定义一个Toast 用makeText 设置要浮
  • Android快速开发框架-ZBLibrary 源码分享

    坐标标准库ZBLibrary 是一个MVP架构的Android快速开发框架 提供一套开发标准 UI Data Listener 以及模板和工具类并规范代码 封装层级少 简单高效兼容性好 一句代码就可实现全局滑动返回 可重写 集成方便快捷的照
  • Compose 动画边学边做 - 夏日彩虹

    引言 Compose 在动画方面下足了功夫 提供了种类丰富的 API 但也正由于 API 种类繁多 如果想一气儿学下来 可能会消化不良导致似懂非懂 结合例子学习是一个不错的方法 本文就带大家边学边做 通过高仿微博长按点赞的彩虹动画 学习和实
  • Android中音频元数据的采集,及RTMP推流

    在用手机做直播推流时 不管是录屏直播 还是摄像头直播 都要用到音频的元数据 在Android中 可以借助AudioRecord来采集音频数据 然后通过faac编码库 加入用的音频编码器是faac 将编码后的数据交给RTMP去封包后发送给服务
  • Opengles 2.0 错误 called unimplemented OpenGL ES API

    在使用Android进行opengl es进行开发时 可能会出现这个called unimplemented OpenGL ES API错误 图也没绘出来 如果确定你的模拟器或者真机支持opengl es 并且支持相关版本时 采用2 0时报
  • RxJava 事件流之聚合

    Aggregation 前面介绍了如何过滤掉不需要的数据 如何根据各种条件停止发射数据 如何检查数据是否符合某个条件 这些操作对数据流来说都是非常有意义的 本节介绍如何根据数据流中的数据来生成新的有意义的数据 本节的操作函数会使用源 Obs
  • Android安卓webview,网页端生成安卓项目(极速生成)教程

    Android安卓webview 网页端生成安卓项目 极速生成 教程 一 前言 当自己做了一个PC端的页面 也就是前端的页面 或者已经上服的页面 但也想生成一个安卓端供用户使用 本教程详细讲解如何把前端html页面或者链接生成安卓端项目 本
  • sqlite3 提示 not found

    在android开发中使用adb shell下的sqlite3命令来查看SQLite数据库时 出现了 sqlite3 not found 错误 在网上搜索了一下问题的原因 原来是模拟器或真机中的 system xbin 目录下少了sqlit
  • 使用Flutter之后,我们的CPU占用率降了50%

    近年来 移动互联网迅猛发展 业务需求频繁更新 业务内容动态化需求急剧增加 纯原生开发已经无法满足业务快速增长的需求 因此诞生了多种跨平台开发框架 如 H5 原生开发 React Native 和 Weex 但这两年最受开发者青睐的莫过于 F
  • java倒叙遍历list

    for int i list size 1 i gt 0 i System out println list get i
  • Android开发中访问服务器常用到的response.getStatusCode()的值各代表什么

    response getStatusCode 200 代表请求成功 response getStatusCode 303 代表重定向 response getStatusCode 400 代表请求错误 response getStatusC
  • Android内存如何优化?阿里技术员工整理亲授,建议收藏

    作者 山鱿鱼说 链接 https juejin cn post 7106289745499521054 基础知识 内存概念 VSS Virtual Set Size 虚拟耗用内存 包含共享库占用的内存 RSS Resident Set Si
  • 一、安卓笔记(1)—Android Studio下的的APP目录结构

    一 Android Studio工程目录 1 gradle文件夹包含的是gradle工具的各个版本 不需要手动去填写 自动生成的 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建开源工具 它使用一种基
  • Android用surface直接显示yuv数据(二)

    研究了一段时间Android的surface系统 一直执着地认为所有在surface或者屏幕上显示的画面 必须要转换成RGB才能显示 yuv数据也要通过颜色空间转换成RGB才能显示 可最近在研究stagefright视频显示时发现 根本找不
  • Android Studio3.5.2 设置代码提示和代码自动补全快捷键

    方法步骤如下 1 左上角点击File选项 找到Settings 2 点击Settings后 找到Editor 3 点击Editor后 找到General 点击General 找到Code Completion 从图中我们可以看到标红 选择F
  • Android获取手机信号强度汇总

    雪里香梅 先报春来早 宋 欧阳修 蝶恋花 如今的天气是越来略冷了 每每走在凛冽的寒风中 心里就一个想法 春 假 天 期 怎么还不到 不知道大家有没有同感 前两天要做一个获取手机信号的小程序 于是在网上搜索了很多 就找到两种方法 遗憾的是都没
  • Android studio创建秘钥提示JKS密钥库使用专用格式。建议使用“keytool -importkeystore -srckeystore....

    1 复制图中 内的内容 keytool importkeystore srckeystore F AndroidTestKey testtow jks destkeystore F AndroidTestKey testtow jks de
  • Android的组件、布局学习

    介绍 公司组织架构调整 项目组需要承接其他项目组的android项目 负责维护和开发新需求 故学习下基础语法和项目开发 组件学习 Toolbar header布局部分 就是app最顶部的部分 他的显示与否 是与F androidProjec
  • 【解决】executable‘s TLS segment is underaligned: alignment is 8, needs to be at least 32 for ARM Bionic

    executable s TLS segment is underaligned alignment is 8 needs to be at least 32 for ARM Bionic 解决办法 使用ndk r21e 指定 sysroo

随机推荐

  • CVPR 2023

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 点击进入 gt 计算机视觉和Transformer 交流群 作者 Oliiiver 源 知乎 编辑 CVer公众号 https zhuanlan zhihu com p
  • 使用TensorFlow Lite将深度学习模型部署到IOT系统

    使用TensorFlow Lite将深度学习模型部署到IOT系统 TensorFlow Lite简介 移动设备深度学习框架是部署在手机或者树莓派等小型移动设备上的深度学习框架 可以使用训练好的模型在手机等设备上完成推理任务 这一类框架的出现
  • yolov5--完全炼丹指南

    目录 前言 炼丹方法 收集数据集 划分数据集 yolov5模型训练 简单提升训练效果的措施 关于参数的说明 结语 前言 最近在做yolov5识别手势的项目 爬了很多坑 也排除了不少bug 记录一下 参考前人的经验 遇到写得好的文章我会推荐
  • 打印出1-10000之间的所有对称数(如121,1331,2442)。

    练习题 打印出1 10000之间的所有对称数 如121 1331 2442 自己写的代码 var isSym function num var str for var i 1 i lt 9 i 如果个位算 可去掉注释 str i str f
  • 干掉广告和钓鱼,这款神器绝了!

    大家好 我是良许 前几天 搜狐丢人丢大发了 自家的员工居然遭遇了钓鱼诈骗 据报道 某员工使用邮件时被意外钓鱼导致密码泄露 进而被冒充财务部盗发邮件 共有 24 名员工被骗取 4 万余元 要知道 搜狐可是国内最早的四大门户网站之一 同时也是国
  • 【9.19】正则表达式——sed、awk

    9 19 正则表达式 sed awk 9 4 9 5 sed 1 sed 匹配 2 sed打印具体行数 3 sed 替换功能 9 6 9 7 awk 1 awk 匹配 2 awk 数学运算表达式 3 两个字段比较大小 4 内置变量 OFS
  • Vue (三) 生命周期--钩子函数

    生命周期 Vue官网生命周期的描述 钩子函数 1 beforeCreate 创建Vue实例化之前所调用的函数 div h1 message h1 div
  • webpack高版本configuration.module has an unknown property ‘loaders‘

    webpack更换高版本后报错 webpack cli Invalid configuration object Webpack has been initialized using a configuration object that
  • ffmpeg已支持解码avs2.0

    https ffmpeg org pipermail ffmpeg devel 2016 November 202446 html PS 目前应该还是个提交的patch 待审核
  • 二叉搜索树(BST)的基本操作

    二叉搜索树 BST 的创建 增加 删除 查找 需要注意 BST的左子树必小于根 右子树必大于根 所以不存在值相同的结点 include
  • 计算机网络(自顶向下方法)中的PoP

    目录 前言 问题 解决 前言 在读 计算机网络 自顶向下方法 时 看到在讲网络结构的时候提到过PoP 但是其中有一句话始终不理解 不通顺 上网搜索也没发现相关解释文章 因此 在我把这个问题解决后 就写下了这篇文章 希望可以帮助到其他人 问题
  • Eclipse常用插件下载地址

    Eclipse常用插件下载地址 官方网站http www eclipse org downloads index php下载eclipse的最新版本 Eclipse 项目资源中心 http www ibm com developerwork
  • 2、Java 环境搭建

    Java 环境搭建 1 JDK 的简介 JDK Java Development Kit 是一组实现Java程序开发与运行的本地环境 在实际的项目的开发与运行过程之中 往往都会选择一些比较好用的桌面系统 Windows MacOS 进行开发
  • linux下定时器timer_create()的使用

    一 采用新线程派驻的方式 注 编译时 需加上 lrt include
  • Spring IoC依赖注入的实现

    看了 spring技术内幕 的第二章 学习了spring的IoC容器的实现 对其做了浅显地分析 依赖注入的时机 如果配置文件有配置lazy init 那么依赖注入的时机发生在用户向IoC 容器索取bean的时候 即调用beanfactory
  • Django基础2——URL路由系统

    文章目录 一 基本了解 二 url路由分发 三 正则匹配 四 压缩归档超链接 优化一 使用分组名称功能 优化二 使用url名称功能 4 1 使用功能之前效果展示 4 2 使用功能之后效果展示 一 基本了解 概念 路由系统就是URL路径和视图
  • 字符串匹配算法总结

    转自 http blog csdn net zdl1016 archive 2009 10 11 4654061 aspx 我想说一句 我日 我讨厌KMP KMP虽然经典 但是理解起来极其复杂 好不容易理解好了 便起码来巨麻烦 老子就是今天
  • 面向对象设计 简述

    面向对象设计 面向对象的特性 将数据封装于类中 完全面型对象 封装 隐藏细节 只给出使用信息 公共的访问方式 隐藏对象的属性和实现细节 继承 继承就是子类继承父类的特征和行为 使得子类对象 实例 具有父类的实例域和方法 或子类从父类继承方法
  • nodeJs(express)文件上传配置

    用node作为服务器端 在需要上传文件到后台时 后台需要相应配置 简单配置如下 1 安装multer依赖 npm install multer save 渣渣前台的渣渣后台技术有限 不是自己配置的node服务器 使用的是webstorm自带
  • Android客户端apk自动检测更新自动下载自动安装的实现方法

    改进了一个可以检测版本更新自动下载自动安装的客户端升级方案 在下载之前删除之前的历史下载文件 减少垃圾数据 先给出核心类 public class DownloadService extends Service private Downlo