设计概述
支持4种升级模式:
强制更新:顾名思义,用户从任何入口进入APP都要弹出更新对话框,且不能退出。
一般更新:每次应用程序启动,用户从任何入口进入APP都要弹出更新对话框,但是可以退出。
可忽略更新:每次应用程序启动,用户从任何入口进入APP都要弹出更新对话框,如果用户点击忽略更新,则下次启动不再提示此次版本的更新。
静默更新:连接WI-FI的条件下直接下载APK,下载成功后弹出更新对话框,提示用户免下载安装
关键要求:
避免未联网条件下进入APP,然后再开启网络,因而绕过了APP版本升级检查
需要注册网络条件的监听,当用户网络连接成功后需要检查版本更新,如果是强更一定要弹出强更对话框
从任何页面进入APP都要进行版本升级监测:
SDK的初始化需要在Applocation onCreate()中检查更新
避免APP没有彻底退出,Applocation onCreate()没有执行,导致无法及时监测到版本更新。
可以配置版本更新接口检查的间隔时间。当页面切换时,监测到距离上一次请求数据时间点超过设定间隔时间就会重新做数据请求
SDK设计需要支持不同的后台接口,因此没有封装接口请求,只提供了数据适配器。
待完善
需要注册网络条件的监听,当用户网络连接成功后需要检查版本更新,如果是强更一定要弹出强更对话框
仓库地址:[email protected]:android/upgrade.git
更新日志:
1.1.3.0app后台恢复有可能导致crash的bug
1.1.2.1优化下载失败的处理逻辑
依赖配置
最新版本可能有变
implementation 'com.trc.android:lib-upgrade:1.1.2.1'
repositories {
maven {//公司Maven私服
url "http://121.41.17.205:18081/nexus/content/repositories/android-realeases"
}
}
初始化核心代码(主要是进行升级数据适配)
public class VersionConfigHelper {
public static void init(Application application) {
VersionUpgrade.init(application, (Callback callback) -> {
String url = "http://10.200.139.23:8080/operation/apk/";
url += "id_62865984C1104652993506B067B66FEA-" + BuildConfig.VERSION_NAME + "-dev_app";
Request request = new Request.Builder().url(url).get().build();
new OkHttpClient().newCall(request).enqueue(new okhttp3.Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.code() == 200) {
String str = response.body().string();
VersionInfoModel model = new Gson().fromJson(str, VersionInfoModel.class);
UpgradeInfo upgradeInfo = new UpgradeInfo();
if (null == model.result) return;
upgradeInfo.downloadUrl = model.result.downloadUrl;//APK下载地址
upgradeInfo.upgradeLog = model.result.description;//版本升级日志
upgradeInfo.lowestVersion = model.result.allowLowestVersion;//服务器要求的最低版本,低于此版本必须强制更新
upgradeInfo.versionName = model.result.currentVersion;//最新版本的版本名称
upgradeInfo.originalData = model;//服务器返回的升级的原始数据
switch (model.result.forceUpdate) {//是否强制更新(0-强制更新,1-一般更新,2-静默更新)
case "0":
upgradeInfo.upgradeType = UpgradeInfo.TYPE_FORCE_UPGRADE;
break;
case "1":
upgradeInfo.upgradeType = UpgradeInfo.TYPE_NORMAL_UPGRADE;
break;
case "2":
upgradeInfo.upgradeType = UpgradeInfo.TYPE_SLIGENT_UPGRADE;
break;
default:
upgradeInfo.upgradeType = UpgradeInfo.TYPE_IGNORE_ABLE_UPGRADE;
}
callback.onResult(true, upgradeInfo);
}
}
});
});
}
}
样式配置
方法1:VersionUpgrade.setDialogLayout(int layoutId),可以创建自己的Layout文件,有ID的控件不要丢失。
方法2:资源替换
更改背景,在-APP模块下drawable-xxhdpi目录下放置app_update_bg.png图片,即可替换原有的图片背景
如果要修改全部样式,创建如下布局文档,命名upgrade_activity_upgrade.xml,不要修改控件ID,不要移除有ID的View,View的样式可以自行调整
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#33000000" android:orientation="vertical"> android:layout_width="280dp" android:layout_height="match_parent" android:layout_gravity="center" android:layout_marginBottom="10dp" android:background="@drawable/app_update_bg" app:base_on_width="true" app:w_h_ratio="1.2"> android:id="@+id/updateVersion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="right" android:textColor="#FFF" android:textSize="16dp" android:textStyle="bold" app:relative_height="0.1" app:relative_left="0.45" app:relative_top="0.2" app:relative_width="0.5" tools:text="V1.0.0.0" /> android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:text="发现新版本" android:textColor="#27a1e5" android:textSize="18dp" android:textStyle="bold" app:relative_height="0.1" app:relative_left="0" app:relative_top="0.4" app:relative_width="1" /> android:id="@+id/updateTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="更新内容:" android:textColor="#000000" android:textSize="16dp" android:textStyle="bold" app:relative_height="0.1" app:relative_left="0.1" app:relative_top="0.52" app:relative_width="0.8" /> android:layout_width="wrap_content" android:layout_height="wrap_content" app:relative_height="0.26" app:relative_left="0.1" app:relative_top="0.62" app:relative_width="0.8"> android:id="@+id/updateContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#525252" android:textSize="15dp" tools:text="1. 标详情页样式调整\r\n2. 投资流程优化\r\n3. 投资协议信息优化\r\n4. 图标活动化埋点\r\n5. 提现支行信息错误修复" /> android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/app_bg_update_alpha" app:relative_height="0.11" app:relative_left="0.1" app:relative_top="0.8" app:relative_width="0.8" /> android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" android:orientation="horizontal" app:relative_height="0.12" app:relative_left="0" app:relative_top="0.96" app:relative_width="1"> android:id="@+id/updateBtn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@drawable/app_dialog_update_btn" android:clickable="true" android:gravity="center" android:paddingLeft="20dp" android:paddingRight="20dp" android:text="立即更新" android:textColor="#FFF" android:textSize="12dp" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> android:id="@+id/installBtn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@drawable/app_dialog_update_btn" android:clickable="true" android:gravity="center" android:paddingLeft="20dp" android:paddingRight="20dp" android:text="立即安装" android:textColor="#FFF" android:textSize="12dp" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> android:id="@+id/ignoreBtn" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="10dp" android:layout_marginRight="10dp" android:background="@drawable/app_dialog_update_btn" android:clickable="true" android:gravity="center" android:paddingLeft="20dp" android:paddingRight="20dp" android:text="忽略该版本" android:textColor="#FFF" android:textSize="12dp" android:textStyle="bold" android:visibility="gone" tools:visibility="visible" /> android:id="@+id/updatePgressView" android:layout_width="match_parent" android:layout_height="match_parent" android:visibility="gone" app:relative_height="0.12" app:relative_left="0.1" app:relative_top="0.95" app:relative_width="0.8" tools:visibility="visible"> android:id="@+id/updateProgess" style="@style/UpgradeUpdateProgressBar" android:layout_width="match_parent" android:layout_height="15dp" android:layout_gravity="center_vertical" android:max="100" android:progress="50" /> android:id="@+id/updateTxtProgress" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="right|center_vertical" android:text="0%" android:textColor="#FFF" android:textSize="15dp" /> android:id="@+id/close" android:layout_width="80dp" android:layout_height="80dp" android:layout_gravity="center_horizontal|bottom" android:layout_marginBottom="40dp" android:clickable="true" android:padding="23dp" android:src="@drawable/app_close" />
注解配置:
在闪屏的Activity添加@VersionCheckIgnore注解,则在该页面不进行版本升级检查
在应用主页面添加@VersionCheckMain注解,主页面切换后台会拉取最新升级数据
Api:
void init(Application application, UpgradeInfoAdapter upgradeInfoAdapter) 完成升级逻辑初始化
void setCheckInterval(int intervalSeconds) 设置检查版本的间隔时间,单位是秒。Activity resume时,如果距离上次成功请求到版本信息的数据时间间隔超过intervalSeconds,那么会立刻通过UpgradeInfoAdapter从服务器拉取版本信息
void showDialogIfHasNewVersion()如果有新版本就弹出升级对话框
void getVersion(Callback callback)通过UpgradeInfoAdapter从服务器拉取版本信息