Java4Android之APP自动升级

如何升级Android Studio 4.1 用Android Studio3.4.*一直没有升级到现在相当一段时间。最近由于“系统灾难”,重装系统后重新安装Android Studio,且导入曾经使用Gradle5.1.1配置的项目,发现一大堆升级和错误警告信息。决定干脆升级整个IDE算了。上网查询最新的Android Studio4.1出来有一段时间。 找到Android Studio下载页面:https://developer.android.google.cn/studio 看的出来,studio图标都更新了。 下载完后直接安装就o. 阅读详情

一个成熟的商业APP必须不断的退出新的版本。那么,不可能让用户自己去应用市场去下载新版本的应用,我们应该在应用内部提供自动升级的功能。自动升级其实包含两个层面,一个是整个APP的升级,也就是下载新版本的APP,然后安装替换掉现有的。还有一种升级是模块升级,这种升级一般采用静默升级,就是用户完全不知道。这个在我大迅雷里面经常做的,拿各个渠道去试错,对于一个互联网公司而言是再普通不过的了。而这些模块,肯定是诸如,解析库,下载库,播放库,这些后台库。。

不过今天,我要说的是APP的自动升级,模块的静默升级我们下次有时间再说。

APP升级流程

盗用别人的图,来说明一下升级APP的整体流程。


对,这个图是盗用别人的。因为,这就是APP升级的一般流程。
所以,我们知道了,第一步,我们需要去服务器查询版本信息,确定是不是要进行升级。

到服务器查询版本信息

具体见代码,
private static final class UpgradeLoader extends AsyncTask<Void, Void, UpdateInfo> {
        private WeakReference<Activity> mContext;
        private boolean mAuto;
        private IUpgradeCheck mUpgradeCheckListener;
        protected boolean mChecked;

        public UpgradeLoader(Activity context, boolean auto, IUpgradeCheck listener) {
            mContext = new WeakReference<Activity>(context);
            mAuto = auto;
            mUpgradeCheckListener = listener;
        }

        @Override
        protected void onPreExecute() {
            if (mUpgradeCheckListener != null) {
                mUpgradeCheckListener.beforeCheck();
            }
        }

        @Override
        protected UpdateInfo doInBackground(Void... params) {
            if (mUpgradeCheckListener != null) {
                mUpgradeCheckListener.onCheck();
            }
            Context ctx = mContext.get();
            String channel = "";
            if (ctx != null) {
                channel = Util.getChannelID(ctx);
            }

            return DataProxy.getInstance().getUpdateInfo(Util.getVersionName(MyApplication.sInstance),
                    Util.getOSVersion(), channel); //去服务器查询版本信息,这个是我们对http的一个封装,在这里,每个公司可以自己定义一些自己的地址和参数,非常简单的。
        }

        @Override
        protected void onPostExecute(UpdateInfo result) {//从服务器查询回来,决定要不要升级
            if (mUpgradeCheckListener != null) {
                mUpgradeCheckListener.afterCheck();
            }
            if (!isCancelled()) {
                if (result == null) {
                    if (!mAuto) {
                        UIHelper.showToast(MyApplication.sInstance, "检查更新失败", Toast.LENGTH_SHORT);
                    }
                } else {
                    switch (result.type) {
                    case UpdateInfo.NO_UPGRADE:
                        if (!mAuto) {
                            UIHelper.showToast(KankanApplication.sInstance, "已经是最新版本,没有更新", Toast.LENGTH_SHORT);
                        }
                        break;

                    case UpdateInfo.UPDATE_NOT_TIPS:
                        if (!mAuto) {
                            buildDialog(result);
                        } else {
                            downloadApk(KankanApplication.sInstance, result.latestUrl);
                        }

                        break;
                    case UpdateInfo.UPDATE_TIPS:
                    case UpdateInfo.UPDATE_FOURCE:
                        if (!(mAuto && PreferenceManager.instance(mContext.get()).isVerionSkiped(result.latestVersion))) {
                            buildDialog(result);
                        }

                    default:
                        break;
                    }
                }
            }
        }
注意上述代码。我们仅仅是示意,所以不可能把所有代码提供给大家学习。就是你第一步是去服务器查询版本信息。然后确定要下载APK的时候,则会调用downloadApk函数。对APK进行下载。

下载APK

在网上,很多人提供了采用httpclient去下载APK的方法,我这里给出另外一种思路。两种方法都可以,建议采用我们的提供的,因为,这个是针对下载较大文件的系统方法。

详见代码:
private static void downloadApk(Context context, String url) {
        DownloadManager manager = (DownloadManager) context.getSystemService(Context.DOWNLOAD_SERVICE);
        Uri uri = Uri.parse(url);
        String scheme = uri.getScheme();
        if (scheme == null || (!scheme.equals("http") && !scheme.equals("https"))) {
            LOG.error("only supports http/https url={}", url);
        } else {
            try {
                DownloadManager.Request down = new DownloadManager.Request(uri);
                down.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_MOBILE
                        | DownloadManager.Request.NETWORK_WIFI);
                down.setShowRunningNotification(true);
                down.setVisibleInDownloadsUi(true);
                down.setDestinationInExternalFilesDir(context, null, APK_NAME);
                manager.enqueue(down);//开始下载
            } catch (Exception e) {
                e.printStackTrace();

                UIHelper.showToast(context, "下载应用失败,请您去应用市场升级", Toast.LENGTH_LONG);
            }
        }
    }
这样,使用DownloadManager可以非常方便的实现APK的下载。如果想对这个类进行更加深入的了解,大家可以去查询相关的资料。你可以查询下载进度等等相关的信息。

下载完成了,接下来就是要安装了。我们需要一个事件去触发安装。做法是,我们应该监听下载完成这件事情,下载完成之后,会有个广播发生,当监听到这个广播的时候我们就开始安装。

安装APK

监听下载完成,并安装。
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE)) {//监听下载完成
            long id = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1);
            if (id > -1) {
                File file = queryFile(context, id);
                if (file != null && file.exists()) {
                    Intent startInent = new Intent();
                    startInent.setAction(Intent.ACTION_VIEW);
                    startInent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startInent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
                    context.startActivity(startInent);//安装APK
                }
            }
        }
    }

至此,一个APK的自动升级就完成了。其实还有一些善后工作需要做的是,你需要删除APK,删除APK的方法应该是在安装完成之后删除,网上有说通过广播监听的方法来删除,就是监听到安装完成之后删除。这个大家去搜索一下就可以。

删除APK文件

这里,我还是给出点示例:
首先是要获取应用的安装状态,通过广播的形式
以下是和应用程序相关的Broadcast Action
ACTION_PACKAGE_ADDED 一个新应用包已经安装在设备上,数据包括包名(最新安装的包程序不能接收到这个广播)
ACTION_PACKAGE_REPLACED 一个新版本的应用安装到设备,替换之前已经存在的版本
ACTION_PACKAGE_CHANGED 一个已存在的应用程序包已经改变,包括包名
ACTION_PACKAGE_REMOVED 一个已存在的应用程序包已经从设备上移除,包括包名(正在被安装的包程序不能接收到这个广播)
ACTION_PACKAGE_RESTARTED 用户重新开始一个包,包的所有进程将被杀死,所有与其联系的运行时间状态应该被移除,包括包名(重新开始包程序不能接收到这个广播)
ACTION_PACKAGE_DATA_CLEARED 用户已经清楚一个包的数据,包括包名(清除包程序不能接收到这个广播)

代码实现 
在AndroidManifest.xml中定义广播

<receiver android:name=".AppInstallReceiver"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.PACKAGE_ADDED" /> 
                <action android:name="android.intent.action.PACKAGE_REPLACED" />
                <action android:name="android.intent.action.PACKAGE_REMOVED" />
                <data android:scheme="package" />
            </intent-filter>
        </receiver>
然后是接收端:
public class AppInstallReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        PackageManager manager = context.getPackageManager();
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) {
            String packageName = intent.getData().getSchemeSpecificPart();
            Toast.makeText(context, "安装成功"+packageName, Toast.LENGTH_LONG).show();
        }
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_REMOVED)) {
            String packageName = intent.getData().getSchemeSpecificPart();
            Toast.makeText(context, "卸载成功"+packageName, Toast.LENGTH_LONG).show();
        }
        if (intent.getAction().equals(Intent.ACTION_PACKAGE_REPLACED)) {
            String packageName = intent.getData().getSchemeSpecificPart();
            Toast.makeText(context, "替换成功"+packageName, Toast.LENGTH_LONG).show();
<span style="white-space:pre">		</span>doanloadApk.delete();//从SD中删除刚刚下载的APK文件
        }

    }
}

好。APK自动升级就说道这里。


有时间,给大家说一下模块的静默升级的实现。



 


c# 比JAVA弱吗? 用c#一份源码同时生成安卓和IOS APP C#一份源码同时开发出ios和android的app, 真实简明图文报告 阅读详情

相关推荐

【MAUI】自动更新功能的安卓App

这里需要使用到 FileProvider,在Android 7之后出于安全考虑不再支持content://URL 或file:///URL这种文件访问方式,可参考FileProvider | Android Developers,我们先添加一下对应配置。在Platforms/Android/Resources下面新建xml文件夹,并添加provider_paths.xml文件。参考:https://blog.youkuaiyun.com/sunday866/article/details/126405322。

德仔 3325

如果用java实现app的热更新操作

1.在数据库记录当前apk包的版本号,然后把包上传到服务器上,并且可用下载 2.每次上传包都更新版本号,app会定时与java的接口调用,判断两个版本号是否一致,如果不一致就提示更新,并且也可以设置提示次数 参考文章: 参考连接 ...

qq_39564710的博客 1487

Android 系统级APP 升级方案 OTA全流程

坑:java.io.FileNotFoundException: /cache/recovery/uncrypt_file (Permission denied)把上述编译好的zip更新包放到指定目录(可通过网络下载方式),然后APP通过下述代码进行升级。完全升级(完整包)、增量升级模式(差异包),可以通过本地升级,也可以通过网络升级。量产固件是分开的,将会影响后面差异包升级,除非你不需要用差异升级。差异包只有差异内容,包大小比较小,主要用于。差异包制作需要特殊的编译进行手动制作。

zljdfaljsfd的博客 6124

android java app 版本升级接口设计与实现更新

中国市场才需要这些emmm 以下是android代码 没有ios的。。google市场不需要 需要的数据 1  把安装包放到服务器生成的url地址 2  升级描述 3  是否强制升级 4  当前应用版本号 步骤 1  判断下载地址 有sd卡存哪里 没有sd卡存哪里 此步骤要尽早完成 所以可以卸载MyApplication的onCreate方法中 try { ...

丿灬安之若死 6378

JAVA实现客户端软件自动更新.pdf

自动升级客户端首先会将本地的autoupdate.xml内容发送给服务端,服务端收到客户端的版本 信息后与服务端本地的版本信息(autoupdate.xml)进行比较,首先比较Version,如果一致 则通知客户端无需更新,如果不一致则检查Files中各文件的SubVer,服务端将SubVer不一致 的文件发送给客户端,对于服务端有而客户端没有的文件也需要发送给客户端,处理完所 有File后,服务端将本地的history.htm与传送给客户端,并通知客户端更新完毕;客户端收 到更新完毕后的应答后自动打开history.htm,将更新历史信息显示给用户查看。

JAVA实现的通用版本升级、检测代码

JAVA实现的通用软件版本更新升级代码,具有对服务器连接情况的判断功能

java软件更新怎么做到的_Android软件如何实现自动更新

packagecom.szy.update;importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.net.HttpURLConnection;importjava.net.MalformedURLException...

weixin_42565652的博客 214

android APP更新实例

android APP更新实例。实现版本号对比,是否需要强制更新,稍后更新。更新后自动安装APP

java app自动更新_简单实现安卓app自动更新功能

简单实现安卓自动更新一般的安卓app都有自动更新功能,实现app的更新,以让用户体验新版本的功能,这里也是项目中用到的,今天就来总结一下,代码应该有点多,还请耐心点哈。安卓应用实现自动更新比较简单,这里跟大家介绍下:第一步 服务器端:服务端提供一个借口,或者网址,我这里就用的服务器是tomcat,这里提供一个网址如下://也就是一个json数据接口public static final Strin...

weixin_39627361的博客 2212

HCIA重点知识

华为认证ICT工程师,是华为认证体系中用于标识个人能力在某一技术领域达到工程师级别的证明,表示通过认证的人员具备安装、配置、运行 ICT 设备,并进行基础故障排除的能力。抽象语言 -----> 编码 -----> 二进制 -----> 电信号 -----> 处理电信号信号的转换标准:协议,是一种允许电子设备相互交流的一系列标准的规则。即开放系统参考模型OSI/RM,简称“OSI”。OSI参考模型将计算机网络分为七个层次,自上而下依次为:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。1、应用层:

Awen0201的博客 2542

关于Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error 解决办法

Win11安装Ubuntu子系统报错:WslRegisterDistribution failed with error

qq_51908382的博客 3万+

安卓APP自动更新功能实现

安卓APP自动更新功能实现前言代码实现 前言 安卓App自动更新基本上是每个App都需要具备的功能,接下来介绍一下实现自动更新的步骤。 代码实现 App自动更新主要分为新版本检测、升级弹窗、下载升级包、安装app这4个步骤,以下为MainActivity的实现代码(注意:目标升级版本和升级包下载地址实际需要向平台拉取): package com.example.testupgrade; import androidx.appcompat.app.AlertDialog; import androidx.

Jason_Flash的博客 7788

闲人闲谈PS之十二——WBS-BOM在装备制造项目中的实战解析

本文深入解析了WBS-BOM在装备制造项目中的核心应用。针对按订单设计/生产的行业痛点,WBS-BOM作为项目专属物料清单,完美连接SAP PS与PP模块,确保MRP能基于项目进行精准物料需求计算,实现从设计到生产的全链路项目化跟踪与管理。

weixin_29284885的博客 399

java升级安卓,使用Retrofit2+RxJava2实现安卓 App自动升级

本文实例为大家共享了Retrofit2 RxJava2实现安卓 App自动升级,详细内容如下功能解析自动升级可以说已经是App的标配了,很多第三方系统也都支持这个功能,最近手头上的项目需要加入这个App自动升级,考虑到项目里有用到Retrofit2和RxJava2,于是打算使用它俩自己实现这个功能。分析App自动升级,可以分为以下三个功能点:1.APK文件的下载2.下载进度的实时升级显示3.下载完...

weixin_42292348的博客 317

AI算力网络与通信领域流量分析:优化策略探讨_副本

今天的AI就像一个"超级吃货",每天要"吃"掉海量数据、“消耗"巨量算力——训练一个千亿参数的大模型,可能需要上万块GPU同时工作数周,其间产生的数据传输量足以填满数百万个1TB硬盘。这些GPU和计算节点通过网络连接形成"AI算力网络”,而数据在节点间的流动就是"通信流量"。如果把算力比作AI的"肌肉",那流量就是"血液"——血液不通畅,肌肉再强也使不上劲。

AI天才研究院 1198

知识图谱构建中的数据清洗:AI原生应用高质量图谱的前提

数据清洗是知识图谱构建的核心前置环节,直接决定AI原生应用(如智能问答、个性化推荐、决策支持系统)的图谱质量与应用效能。本文以第一性原理为起点,系统解析数据清洗的理论框架、技术架构与工程实践,覆盖从多源异构数据的噪声检测到高质量知识三元组(实体-关系-实体)生成的全流程。通过层次化概念映射(专家→中级→入门)、数学形式化建模及工业级案例分析,揭示数据清洗在解决实体歧义、关系冲突、结构不一致等关键问题中的技术逻辑,并展望基于大模型的智能清洗范式演化。Completeness(完整性)

移动开发前沿的博客 404

App自动化测试怎么做?实战分享App自动化测试全流程

一、什么是app测试?什么是app自动化测试? 概念:所谓app测试也称之为移动测试,通俗易懂的理解就是测试我们平时手机使用的程序。那什么是app自动化测试呢? 通常情况下是随app产品不断迭代更新,给测试⼈员也增加了测试⼯作量,特别是⼤量繁琐的回归测试。⾃动化测试是应对产品不断迭代更新的辅助测试⼿段(主要是针对回归测试),最终⽬的是为了保证产品质量。简而言之就是自动化的有点就是可重复、效率高,增加软件信任度。 >> 下载300G软测学习资料包【视频教程+PPT+课件+项目源码】 二、

测试猿课堂-分享软件测试技术知识和专业的软件测试职业进阶转行指导! 1万+

如何合法抓取TikTok视频信息和评论:完整Python爬虫教程

尽管TikTok没有开放的公共API来直接抓取视频内容和评论,开发者仍然可以通过合法的方式使用第三方API工具来获取公开数据。无论使用什么工具,都应当严格遵守TikTok的使用条款和当地的隐私法规,确保数据抓取行为符合规定。通过本文介绍的TikTok-Api库和Python技术,你可以合法地抓取公开的视频信息和评论,并进行数据存储与分析。使用这些技术时,务必确保抓取行为不会侵犯用户隐私,并遵守平台的API使用规定。

2201_76125261的博客 1710

android 实现 APP 保活且正常升级的方法

翻译机App保活 技术调研报告 Android系统核心App需要在Android开机期间一直后台运行,如果被杀死会立即重启。这个功能的实现是在App的AndroidManifest.xml添加android:persistent="true"属性控制。但是Android 8.0之后含有Persist的App禁止升级。如果我们把翻译服务相关的Ap设置android:persistent="true"...

lb5761311的专栏 5104

【网络与爬虫 53】Scrapy-Prometheus实战指南:打造企业级爬虫监控体系的终极解决方案

本文深入探讨Scrapy-Prometheus集成技术,通过费曼学习法从监控痛点出发,详细讲解如何在Scrapy爬虫中集成Prometheus指标收集系统。涵盖从基础配置到企业级监控体系的完整实战指南,帮助开发者构建可观测性强、可维护性高的分布式爬虫监控平台,实现爬虫性能的精准监控和智能告警。

熵数实验室 1586

PCL 点云八叉树射线相交

PCL 点云八叉树射线相交

dayuhaitang1的博客 850

android App版本升级功能

一般的安卓app都有自动更新功能,实现app的更新,以让用户体验新版本的功能,这里也是项目中用到的,今天就来总结一下。做和记录。import android.annotation.SuppressLint; import android.app.Activity; import android.content.Context; import android.content.Intent; impo...

可乐的博客 3301

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

终极Android版本更新库:如何3行代码实现App自动升级功能

**Android App Update** 是一个轻量级、高度可定制的Android版本更新库,专为新手开发者设计。通过简单集成,即可实现后台下载、强制更新、通知栏进度展示等核心功能,完美适配Android 4.1至最新系统,无需复杂配置即可快速提升App用户体验。 ## ???? 为什么选择这款更新库?核心优势解析 传统的App更新功能开发往往需要处理权限申请、版本比对、下载管理等繁琐步骤,而...

gitblog_00264的博客 1184

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

BTTV安卓版版本更新机制:自动更新与手动升级对比

BTTV(BetterTTV)安卓版是一款为Twitch移动应用提供增强功能的开源模组,支持BetterTTV、FrankerFaceZ和7TV表情等扩展功能。为确保用户始终能体验到最新功能与安全修复,BTTV安卓版设计了完善的版本更新机制,主要分为自动更新与手动升级两种方式。本文将详细对比这两种更新方式的工作原理、操作流程及适用场景,帮助用户选择最适合自己的更新策略。 [![BTTV安卓版应用

gitblog_00823的博客 999

H Builder 浅谈移动App升级更新

最近项目用到H Builder开发,官方提供的三种升级方式不是很人性化,本人做了差量更新插件,只需要提交内存占用不大的文件,即可完成更新,如果需要添加图片,也可以将图片资源放入更新包中,即可以不必大量打差量升级包,同时也为用户节省流量,方便小版本的频繁更新。相当于结合wgt和wgtu的改版。

Jarry的博客 1万+
上一篇: Java4Android之HttpClient入门使用代码集
下一篇: Java4Android之socket网络通信基础
minimicall
博客等级 码龄18年 407粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值