正常app的升级流程:

1.网络请求,根据返回结果判断是否需要更新应用

2.如果需要更新,会弹框显示版本说明,以及是否需要强制更新(有些大版本升级可能对原本的支持不够,此时为了避免不可控因素需要强制升级,当然用户体验不会好)

3.确定更新之后,判断之前是否下载过该版本,如果已经下载过则直接安装更新,若没下载过,则直接下载并通知用户当前下载进度

4.安装

这里简单记录一下之前项目升级中用到的bean类、实现方法,方便日后查看(可能会有不全)

网络请求返回的bean类(有些字段可能没用到,按需书写)

public class VersionBean implements Serializable {private String id;private String versionCode;//版本号private String update_list;//更新信息列表private String compel; //是否强制更新 0 非强制  1 强制   控制弹出对话框是否可取消private String update_link;//更新地址private String ctime;//创建时间private String type;// 0 IOS 1Androidprivate String versionName;
}

检查版本更新(接口请求的逻辑按照项目里已有的书写就行,每个项目可能都略有区别,主要看拿到数据之后的逻辑)

    /*** 检查版本更新*  @param isMain:从主页直接请求的还是在设置中点击版本检查的*/public void httpCheckVersion(final boolean isMain) {Map<String, String> versionMap = new TreeMap<>();versionMap = CommonUtils.addGETParam(versionMap, this);new NetRetorfit(this, UrlUtils.NEWVERSION_UPDATE_URL, versionMap).setNetCallBack(new NetRetorfit.NetCallBack() {@Overridepublic void onSucceed(String backMes) {if (getContext() == null) {return;}HttpResposeBean<VersionBean> body = new Gson().fromJson(backMes, new TypeToken<HttpResposeBean<VersionBean>>() {}.getType());if (body != null && body.code == 0 && body.data != null) {versionBean = body.data;// 0.获取当前版本号int nowVersion = CommonUtils.getAppVersionCode(BaseFragmentActivity.this);// 1.存在新版本if (Integer.parseInt(versionBean.getVersionCode()) > nowVersion) {// 1.1android版本下载地址newApkUrl = versionBean.getUpdate_link();// 是否强制更新 【0不强制 1强制】boolean cancelable = false;if (!TextUtils.isEmpty(versionBean.getCompel()) && versionBean.getCompel().equals("0")) {cancelable = true;} else if (!TextUtils.isEmpty(versionBean.getCompel()) && versionBean.getCompel().equals("1")) {cancelable = false;}showUpdateVIDialog(versionBean.getVersionName(), cancelable);} else if (!isMain) {ToastUtil.toast("当前已是最新版本");}}}@Overridepublic void onFailed() {}}).start();
}/*** 获取应用的版本号。*/public static int getAppVersionCode(Context context) {try {PackageManager manager = context.getPackageManager();PackageInfo info = manager.getPackageInfo(context.getPackageName(), 0);int versionCode = info.versionCode;return versionCode;} catch (Exception e) {e.printStackTrace();return 0;}}

显示版本更新弹窗(原有项目用的是DialogPlus三方框架,怎么方便怎么来,可以直接自定义)

private void showUpdateVIDialog(String newVersionName, final boolean cancelable) {ViewHolder holder = new ViewHolder(R.layout.dialog_update_version);dialog = DialogPlus.newDialog(getContext()).setContentHolder(holder).setContentBackgroundResource(R.drawable.alert_diolag_bg_shape).setContentWidth(ViewGroup.LayoutParams.WRAP_CONTENT)  // or any custom width ie: 300.setContentHeight(ViewGroup.LayoutParams.WRAP_CONTENT).setGravity(Gravity.CENTER).setOnDismissListener(null).setOnCancelListener(null).setExpanded(false).setCancelable(cancelable).create();TextView text_warning = (TextView) dialog.findViewById(R.id.text_warning);Button btn_update_version = (Button) dialog.findViewById(R.id.btn_version_update);if (versionBean != null && !TextUtils.isEmpty(versionBean.getUpdate_list())) {text_warning.setText(versionBean.getUpdate_list().replace("\\n", "\n"));} else {text_warning.setText("检测到新版本" + newVersionName + ",立即更新");}// 立即更新按钮btn_update_version.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {downApk(newApkUrl);}});dialog.show();}

下载并安装app

   public void downApk(String path) {Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);Uri uri = null;LogUtils.d("path:" + path);if (Build.VERSION.SDK_INT > 23) {intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);boolean b = false;if (Build.VERSION.SDK_INT > 26) {b = getPackageManager().canRequestPackageInstalls();}if (b)uri = FileProvider.getUriForFile(this, BuildConfig.APPLICATION_ID + ".fileProvider", new File(path));} else {uri = (Uri.fromFile(new File(path)));}path = uri.getPath();intent.setDataAndType(uri,"application/vnd.android.package-archive");startActivity(intent);}

  注:之前的下载直接是应用内下载的,地址直接为官网上的下载地址,后来涉及到有版本更新时的瞬时下载流量问题(具体我也不懂,反正涉及到了费用问题),改为了直接去应用宝上下载更新(手机里没有应用宝的跳转到浏览器的应用宝下载链接上去下载),相对比较麻烦,但为了省钱,也没想到有啥别的办法,下面贴一下这部分的代码

    /*** 打开应用宝/链接去下载更新安装包** @param url:应用宝上的下载链接*/private void downApk(String url) {if (!BuildConfig.DEBUG && DeviceUtils.isAppInstall(this,"com.tencent.android.qqdownloader")) {Intent intent = new Intent();intent.setAction(Intent.ACTION_VIEW);Uri content_url = Uri.parse("market://details?id=" + getPackageName());try {intent.setClassName("com.tencent.android.qqdownloader", "com.tencent.pangu.link.LinkProxyActivity");intent.setData(content_url);startActivity(intent);} catch (Exception e) {intent.setData(Uri.parse(url));startActivity(intent);}} else {Intent updateIntent = new Intent();updateIntent.setAction(Intent.ACTION_VIEW);Uri content_url = Uri.parse(url);updateIntent.setData(content_url);startActivity(updateIntent);}}

上面是之前项目中用到的,应该算是经过证实的,不过有段时间没使用了(可能存在android版本适配问题等),今天又查看了一下相关资料,个人认为这个写的比较好,可以参考一下:

地址:https://www.jianshu.com/p/234426d802a0

android应用更新升级相关推荐

  1. android 上下偏差怎么写_详解 Android 热更新升级如何突破底层结构差异?

    知道了 native 替换方式兼容性问题的原因,我们是否有办法寻求一种新的方式,不依赖于 ROM 底层方法结构的实现而达到替换效果呢? 我们发现,这样 native 层面替换思路,其实就是替换 Art ...

  2. android增量更新 腾讯,国内率先支持增量更新 腾讯应用宝3.1更快更省

    为了让Android用户更新升级已安装应用的速度更快,更省流量,近日腾讯应用宝继刚刚发布的全新3.0随心版后, V3.1版国内首家率先支持省流量"增量升级"新功能,只要用户安装了旧 ...

  3. 诺基亚7plus更新android10,诺基亚发布第五次Android 10更新 诺基亚7+可升级

    1月8日消息,诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商 ...

  4. android应用程序的自动更新升级(自身升级,通过tomcat),[SaltStack] Minion-conf自动更新...

    minion-conf配置文件自动更新, 加载 minion-conf是每个minion自身以来的配置, 为了方便我们在中心管控机上(Master)统一配置, 然后下发文件, 进而使得Minion能够 ...

  5. 诺基亚升级Android10,诺基亚发布第五次Android 10更新 ,诺基亚7+可升级

    1月8日消息,诺基亚发布第五次Android 10系统更新.虽然目前还不清楚谷歌将来是否会在全球推广Android 10系统,但有一点很明显,此次推出Android 10的速度要比几个主要智能手机厂商 ...

  6. pixel一代升级android10,谷歌Pixel系列首次Android 10更新:我们都应该知道些什么

    本文由腾讯数码独家发布 谷歌已经与10月7日发布了其Pixel系列Android 10的首次更新,按照惯例来讲,谷歌会在每个月的月初对其进行更新.此次更新为整个Pixel系列手机提供了一些重要的更改和 ...

  7. android版本怎么升级到7,安卓7.0更新

    [CNMO新闻]近日,微信再次迎来更新,不出意外的话,这将会是年前的最后一次更新.本次更新版本为7.0.3,用户可以在微信端进行更是体验,主要是修复了一些已知的bug,并且小程序有了全新的显示界面,或 ...

  8. android智能手表要怎么更新版本号,你以为只有Android手机不能升级系统吗?现在智能手表也是...

    原标题:你以为只有Android手机不能升级系统吗?现在智能手表也是 北京时间6月13日上午消息,谷歌尚未正式宣布哪些智能手表将在Android Wear 2.0今年晚些时候发布时获得这项系统更新,但 ...

  9. Android11什么时候升级,Android 11怎么升级?安卓11升级更新方法

    最近谷歌推出了Android 11,这个版本中虽然没有太大的改变,但是推出的一些小功能还是很实用的,像内置屏幕录像之类的功能都是大家期待了很久的.很多人都不知道Android 11怎么升级,下面小编就 ...

最新文章

  1. Android RecycleView ScrollBy不生效
  2. 一个IT人的非典型职场十年 (5)
  3. GWT和HTML5 Canvas演示
  4. git 空提交和重置提交者(转载)
  5. 农村大学生的出路或许是读个真才实学的博士
  6. resnet10 从tk1 上移植到linux 上 上遇到的问题
  7. Egret入门学习日记 --- 第十篇(书中 2.9~2.13节 内容)
  8. @Autowired与@Resource的差别
  9. C# winform使用InstallShield2019打包
  10. 2020年下半年信息安全工程师下午真题及答案解析
  11. 2020年找工作越来越难,程序员真的过剩了吗?
  12. 第四方聚合支付服务的前景
  13. python中delta是什么意思_如何使用python计算Delta F/F?
  14. (java)跳台阶:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
  15. 根据心电信号计算心率的matlab代码
  16. 括号画家(括号匹配)
  17. 整体大于部分_Redis典型应用场景实战之抢红包系统整体业务流程分析赠书
  18. Python实现简单的web爬虫信息处理系统
  19. c#创建word表格 将表格所有内容居中
  20. Pytorch中shuffle=True的作用

热门文章

  1. 智能wifi小车-RGB三色LED灯驱动
  2. 程序员的8个高薪职业发展方向,总有一个适合你!
  3. python中setup是什么意思_『Python』setup.py简介
  4. PDF文件怎么转PPT格式?不会的小伙伴快看过来
  5. 开启win10下Ubuntu子系统的SSH服务
  6. 【全文翻译】Edge Intelligence: Paving the Last Mile of Artificial Intelligence With Edge Computing
  7. 解决ios 调用微信JSSDK 签名失败
  8. 韩松手机摄影笔记第一课---手机拍照核心功能全解
  9. 海马体照相馆携手神策数据:99.7% 的摄影满意度,离不开专业与数据驱动
  10. vue系统权限(动态加载路由方式)