实现效果
添加依赖
repositories {
jcenter()
}
根据自己使用的APP的框架选用不同的包引入:
dependencies {
// For developers using AndroidX in their applications
implementation 'com.teprinciple:updateapputilsx:2.3.0'
// For developers using the Android Support Library
implementation 'com.teprinciple:updateapputils:2.3.0'
}
声明权限
在AndroidManifest.xml文件中声明所需要的动态权限:
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"></uses-permission>
初始化
这三个变量可通过服务器实现从数据库中获取,本文只是写死了地址还没有实现服务端功能…
首先需要定义三个全局变量,也可以选择直接写到方法里:
//APK的地址
private String apkUrl = "此处填写APK地址";
//更新弹窗标题
private String updateTitle = "发现新版本";
//更新弹窗简介
private String updateContent = "1、...\n2、...\n3、更多功能等你探索";
在Activity中的*onCreate()*方法中初始化框架:
//初始化
UpdateAppUtils.init(this);
实现功能
可以写进一个方法来调用也可直接写在Activity中的*onCreate()*方法中实现:
public void UpdateApp(){
//更新配置信息
UpdateConfig updateConfig = new UpdateConfig();
//检查Wifi状态
updateConfig.setCheckWifi(true);
//开启MD5校验
updateConfig.setNeedCheckMd5(true);
//开启下载进度条
updateConfig.setAlwaysShowDownLoadDialog(true);
//关闭通知栏进度条
updateConfig.setShowNotification(false);
//关闭下载提示框
updateConfig.setShowDownloadingToast(false);
//UI配置信息
UiConfig uiConfig = new UiConfig();
uiConfig.setUiType(UiType.PLENTIFUL);
//功能Api
UpdateAppUtils
.getInstance()
.apkUrl(apkUrl)
.updateTitle(updateTitle)
.updateContent(updateContent)
.uiConfig(uiConfig)
.updateConfig(updateConfig)
.setMd5CheckResultListener(new Md5CheckResultListener() {
@Override
public void onResult(boolean result) {
if(result == false) {
Toast.makeText(MainActivity.this, "Md5检验未通过,请晚些再更新!", Toast.LENGTH_SHORT).show();
}
}
})
.update();
}
框架其余Api说明:
1、UpdateAppUtils Api
api | 说明 | 默认值 | 必须设置 |
---|---|---|---|
funapkUrl(apkUrl:String) | 更新包服务器url | null | true |
funupdate() | UpdateAppUtils入口 | - | true |
funupdateTitle(title:String) | 更新标题 | 版本更新啦! | false |
funupdateContent(content:String) | 更新内容 | 发现新版本,立即更新 | false |
funupdateConfig(config:UpdateConfig) | 更新配置 | 查看源码 | false |
funuiConfig(uiConfig:UiConfig) | 更新弹窗UI配置 | 查看源码 | false |
funsetUpdateDownloadListener() | 下载过程监听 | null | false |
funsetMd5CheckResultListener() | md5校验结果回调 | null | false |
funsetOnInitUiListener() | 初始化更新弹窗UI回调 | null | false |
fundeleteInstalledApk() | 删除已安装的apk | - | false |
funsetCancelBtnClickListener() | 暂不更新按钮点击监听 | - | false |
funsetUpdateBtnClickListener() | 立即更新按钮点击监听 | - | false |
2、UpdateConfig:更新配置说明
属性 | 说明 | 默认值 |
---|---|---|
isDebug | 是否输出【UpdateAppUtils】为Tag的日志 | true |
force | 是否强制更新,强制时无取消按钮 | false |
apkSavePath | apk下载存放位置 | 包名目录 |
apkSaveName | apk保存文件名 | 项目名 |
downloadBy | 下载方式 | DownLoadBy.APP |
needCheckMd5 | 是否需要校验apk签名md5 | false |
checkWifi | 检查是否wifi | false |
isShowNotification | 是否显示通知栏进度 | true |
notifyImgRes | 通知栏图标 | 项目icon |
serverVersionName | 服务器上apk版本名 | 无 |
serverVersionCode | 服务器上apk版本号 | 无 |
alwaysShow | 是否每次显示更新弹窗(非强更) | true |
thisTimeShow | 本次是否显示更新弹窗(非强更) | false |
alwaysShowDownLoadDialog | 是否需要显示更新下载进度弹窗(非强更) | false |
showDownloadingToast | 开始下载时是否显示Toast | true |
3、UiConfig:更新弹窗Ui配置说明
属性 | 说明 | 默认值 |
---|---|---|
uiType | ui模板 | UiType.SIMPLE |
customLayoutId | 自定义布局id | false |
updateLogoImgRes | 更新弹窗logo图片资源id | - |
titleTextSize | 标题字体大小 | 16sp |
titleTextColor | 标题字体颜色 | - |
contentTextSize | 内容字体大小 | 14sp |
contentTextColor | 内容字体颜色 | - |
updateBtnBgColor | 更新按钮背景颜色 | - |
updateBtnBgRes | 更新按钮背景资源id | - |
updateBtnTextColor | 更新按钮字体颜色 | - |
updateBtnTextSize | 更新按钮文字大小 | 14sp |
updateBtnText | 更新按钮文案 | 立即更新 |
cancelBtnBgColor | 取消按钮背景颜色 | - |
cancelBtnBgRes | 取消按钮背景资源id | - |
cancelBtnTextColor | 取消按钮文字颜色 | - |
cancelBtnTextSize | 取消按钮文字大小 | 14sp |
cancelBtnText | 取消按钮文案 | 暂不更新 |
downloadingToastText | 开始下载时的Toast提示文字 | 更新下载中… |
downloadingBtnText | 下载中下载按钮以及通知栏标题前缀,进度自动拼接在后面 | 下载中 |
downloadFailText | 下载出错时,下载按钮及通知栏标题 | 下载出错,点击重试 |
所有代码
注释已经写的很详细了,其余就不做赘述了,以下是全部代码:
package com.example.updatedemo;
import androidx.appcompat.app.AppCompatActivity;
import constant.UiType;
import listener.Md5CheckResultListener;
import model.UiConfig;
import model.UpdateConfig;
import update.UpdateAppUtils;
import android.os.Bundle;
import android.widget.Toast;
import org.jetbrains.annotations.NotNull;
/**
*
* @author 纸鱼
* @since 2022-11-07 22:50
*
*/
public class MainActivity extends AppCompatActivity {
//APK的地址
private String apkUrl = "此处填写APK地址";
//更新弹窗标题
private String updateTitle = "发现新版本";
//更新弹窗简介
private String updateContent = "1、...\n2、...\n3、更多功能等你探索";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化
UpdateAppUtils.init(this);
UpdateApp();
}
public void UpdateApp(){
//更新配置信息
UpdateConfig updateConfig = new UpdateConfig();
//检查Wifi状态
updateConfig.setCheckWifi(true);
//开启签名文件MD5校验
updateConfig.setNeedCheckMd5(true);
//开启下载进度条
updateConfig.setAlwaysShowDownLoadDialog(true);
//关闭通知栏进度条
updateConfig.setShowNotification(false);
//关闭下载提示框
updateConfig.setShowDownloadingToast(false);
//UI配置信息
UiConfig uiConfig = new UiConfig();
uiConfig.setUiType(UiType.PLENTIFUL);
//功能Api
UpdateAppUtils
.getInstance()
.apkUrl(apkUrl)
.updateTitle(updateTitle)
.updateContent(updateContent)
.uiConfig(uiConfig)
.updateConfig(updateConfig)
.setMd5CheckResultListener(new Md5CheckResultListener() {
@Override
public void onResult(boolean result) {
if(result == false) {
Toast.makeText(MainActivity.this, "Md5检验未通过,请晚些再更新!", Toast.LENGTH_SHORT).show();
}
}
})
.update();
}
}
结语
作者给的Api表格里的功能以及UI样式很全,可根据需要自行定制,如果对UI风格不满意可以去作者的GitHub上看自定义UI的教程。
UpdateAppUtils框架GitHub地址:https://github.com/teprinciple/UpdateAppUtils