简介
1.基于DownLoadManager实现,支持断点续传。
2.安装包自动缓存、删除。如果下载完成后用户没有安装,那么下次则直接自动跳过下载。安装成功后会自动删除之前的安装包。
3.支持安装包完整性校验,目前支持MD5和SHA1校验,用与解决网络环境不好时导致下载丢包,从而导致一直提示安装包无效的问题。
4.支持自定义弹窗(提供了默认的弹窗),如果你不喜欢默认提供的弹窗,那么你可以自定义。
5.从3.0.0版本开始改为纯Kotlin实现并基于Androidx库。
演示
按照惯例还是先上图吧。
默认弹窗样式
更新
3.0.1 将DefaultUpdateDialog改为open(可以被继承)。
将DefaultUpdateDialog改为open(可以被继承),这将使得自定义弹窗更加容易,你可以直接继承DefaultUpdateDialog来自定义你的弹窗。
3.0.0 基于Kotlin和Androidx重构
- 基于Kotlin语言进行重构并迁移至Androidx。没有迁移至Androidx的小伙伴请使用之前的版本。
- 优化升级弹窗的逻辑,使得自定义弹窗更加容易。
2.2.3及以前
基于Java、Support库开发,可自定义弹窗、支持完整性校验、自动缓存。
下载
第一步:添加 JitPack 仓库到你项目根目录的 gradle 文件中。
allprojects {
repositories {
//省略部分代码...
maven { url 'https://jitpack.io' }
}
}
第二步:添加这个依赖。
dependencies {
implementation 'com.github.kelinZhou:ApkUpdater:${Last version here!}'
}
使用
第一步:添加权限
你需要在你的清单文件中添加以下权限:
<!--网络访问权限-->
<uses-permission android:name="android.permission.INTERNET"/>
<!--不弹出通知栏权限-->
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION"/>
<!--DownloadManager-->
<uses-permission android:name="android.permission.ACCESS_DOWNLOAD_MANAGER"/>
<!--获取网络状态权限-->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!--APK安装权限-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
第二步:清单文件配置
你需要在你清单文件中的Application节点下添加如下配置:
<!--Android7.0一上安装Apk所需要的文件提供者-->
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/apk_updater_file_paths" />
</provider>
<!--版本更新服务-->
<service android:name="com.kelin.apkUpdater.DownloadService" />
provider标签中android:authorities
的值可以自定义,需要在初始化ApkUpdater.init(context,fileProvider)
方法中传入该值。
在Android7.0以上的设备如果不能正常下载你可能还需要在清单文件的Application节点下增加networkSecurityConfig配置。例如:
<application
android:name=".App"
android:networkSecurityConfig="@xml/network_security_config">
<!--此处省略了你的Activity、Service等四大组件-->
</application>
其中 network_security_config 文件需要定义在res的xml文件夹下,它的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<certificates src="system" />
</trust-anchors>
</base-config>
</network-security-config>
第三步:初始化
你需要在Application的onCreate方法中调用ApkUpdater.init(context, fileProvider)
初始化ApkUpdater。例如:
class App : Application() {
override fun onCreate() {
super.onCreate()
ApkUpdater.init(this, "$packageName.fileProvider")
}
}
注意: 别忘记在清单文件中使用你的Application:
<application
android:name=".App" //这里是你自定义的Application。
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<!--此处省略了你的Activity、Service等四大组件-->
</application>
第五步:检测更新
首先利用你项目的网络访问能力从服务器端获取更新信息并转换为javaBean对象,然后让这个对象实现UpdateInfo接口。下面是这个接口中所有方法:
ApkUpdater.Builder().create().check(
UpdateInfoImpl(
"http://test-cloud-yxholding-com.oss-cn-shanghai.aliyuncs.com/yx-logistics/file/file/20200703/1593709201374.apk", //安装包下载地址
131, //网络上的版本号,用于判断是否可以更新(是否大于本地版本号)。
"v1.3.1", //版本名称,用于显示在弹窗中,以告知用户将要更到哪个版本。
false, //是否是强制更新,如果干参数为true则用户没有进行更新就不能继续使用App。(当旧版本存在严重的Bug时或新功能不与旧版兼容时使用)
"更新内容如下:", //升级弹窗的标题。
"1.修复了极端情况下可能导致下单失败的bug。\n2.增加了许多新的玩法,并且增加了app的稳定性。 \n3.这是测试内容,其实什么都没有更新。", //升级弹窗的消息内容,用于告知用户本次更新的内容。
SignatureType.MD5, //安装包完整性校验开启,并使用MD5进行校验,如果不想开启,传null。(目前只支持MD5和SHA1)
"" //完成性校验的具体值,返回空或null则不会进行校验。
)
)
其他
构建Updater对象
方法名 | 说明 |
---|---|
setCallback(callback: IUpdateCallback?) |
设置监听对象。 |
setDialogGenerator(generator: (updater: ApkUpdater) -> ApkUpdateDialog) |
使用自定义弹窗。 |
create() |
完成Updater对象的构建。 |
自定义Dialog
ApkUpdater.Builder()
.setDialogGenerator {
MyUpdateDialog(it)
}.create()
MyUpdateDialog 是ApkUpdateDialog接口的实现类,也可以直接继承DefaultUpdateDialog。ApkUpdateDialog接口中都有注释,写的应该还算比较详细的,这里就不在讲了。
检查更新
检查更新的代码如下:
apkUpdater.check(updateInfo)
安装APK
安装是不许要你关心的,下载完成后会自动进入安装页面。除非你禁用了自动安装,或是想安装一个现有的Apk。如果是这样的话你可以使用UpdateHelper的fun installApk(context: Context, apkFile: File?): Boolean
方法。
其他
该项目中提供了两个工具类:UpdateHelper 和 NetWorkStateUtil。
网友评论