在本文中,我们将了解Android中的应用程序内更新功能,以及有关应用程序内更新的全部内容,以及在Android应用程序中使用应用程序内更新的好处。最近,我一直在开发需要实现应用内更新的产品。为什么我们需要实现此功能?
作为开发人员,我们始终希望我们的用户拥有其应用程序的更新版本,但是实际上有很多人从google play商店中关闭了自动更新,并且他/她不知道有没有可用的更新。
为解决此问题,Google从此功能中引入了称为应用内更新的功能,您可以轻松地提示用户更新应用,并在获得用户许可的情况下也可以更新应用,同时更新应用的用户可以与应用进行交互。现在,用户无需去Google Play商店检查是否有可用的更新。
弹性更新:
在“灵活更新”中,将出现对话框,并且在更新后,用户可以与应用程序进行交互。
建议在应用程序中没有重大更改(例如某些不影响应用程序核心功能的功能)时使用此模式。
应用程序的更新是在灵活更新的后台下载的,下载完成后,用户将看到对话框,用户需要在其中重新启动应用程序。该对话框不会自动显示,我们需要检查并显示给用户,稍后我们将学习如何操作。
优点:
灵活更新的主要好处是用户可以与应用程序进行交互。
灵活更新的示例:
即时更新:
在即时更新中,全屏用户界面出现在我们的应用程序中,用户无法与该应用程序进行交互,并且在更新后,该应用程序自行重新启动并更新了该应用程序。
当您的应用程序更新直接影响核心功能时,建议使用此模式,就像您进行任何重要更新一样,因此我们需要使用此模式。
即时更新示例:
实现方式:
让我们从应用内更新实施开始,我们首先需要做的是。
步骤1:添加依赖
将Google Play核心依赖项添加到您的android build.gradle
文件中,如下面的代码段所示。
implementation'com.google.android.play:core:1.6.4'
步骤2:建立AppManager执行个体
我们需要创建的实例AppManager
来获取应用内更新信息,您可以在OnCreate method
下面的代码段中对此进行定义:
// Creates instance of the manager.
private val appUpdateManager: AppUpdateManager? = AppUpdateManagerFactory.create(activity)
步骤3:检查更新
现在,我们需要检查更新是否可用,然后再请求更新,如下面的代码片段所示:
private fun checkUpdate() { // Returns an intent object that you use to check for an update. val appUpdateInfoTask = appUpdateManager?.appUpdateInfo // Checks that the platform will allow the specified type of update. Log.d(TAG, "Checking for updates") appUpdateInfoTask?.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)){ // Request the update. Log.d(TAG, "Update available") } else { Log.d(TAG, "No Update available") } } }
在上面的代码中,我创建了一个函数,该函数的名称checkUpdate()
是我首先使用appUpdateManager
先前在第2步中创建的实例获取应用程序更新信息,并分配给了另一个变量,appUpdateInfoTask
现在一切似乎都很好,现在我们有了可用的信息,我们只需要添加一个侦听器来检查新更新是否可用。
在addOnSuccessListener
我们需要先检查是否有可用更新或不与功能updateAvailability()
,这将返回布尔值,并且还设置方式灵活| 即时。如果两个条件都满足,则我们有可用的更新,我们很高兴提出更新请求。
步骤4:请求更新
在第4步中,我们将学习如何请求更新,要更新请求,我们需要使用AppUpdateManager.startUpdateFlowForResult()
以下代码段:
appUpdateManager.startUpdateFlowForResult( // Pass the intent that is returned by 'getAppUpdateInfo()'. appUpdateInfo, // Or 'AppUpdateType.FLEXIBLE' for flexible updates. AppUpdateType.FLEXIBLE, // The current activity making the update request. this, // Include a request code to later monitor this update request. MY_REQUEST_CODE)
在上面的代码中,使用startUpdateFlowForResult函数,我们可以请求更新,我们需要在其中传递一些参数。
- appUpdateInfo->传递
getAppUpdateInfo()
函数返回的意图 - AppUpdateType.FLEXIBLE->这是一种更新模式,您可以设置IMMEDIATE | 灵活
- 这->当前活动发出更新请求
- MY_REQUEST_CODE->这是一个监视更新请求的请求代码,
OnActivityResult
将在下面进行讨论。
步骤5:监控更新
现在,按照上述步骤后,你会看到更新对话框出现,在你有两个选择不,谢谢 | 更新按钮,如下面的屏幕截图所示。
单击更新按钮后,更新将在后台开始,下载开始后,您需要在可以安装更新时监视更新并在应用程序的UI中显示进度。因此,我们需要注册侦听器以获取状态更新。像下面的代码片段:
private val listener: InstallStateUpdatedListener? = InstallStateUpdatedListener { installState ->if (installState.installStatus() == InstallStatus.DOWNLOADED) { // After the update is downloaded, show a notification // and request user confirmation to restart the app. Log.d(TAG, "An update has been downloaded") showSnackBarForCompleteUpdate() } }
在上面的代码中,InstallStateUpdateListener
会为我们提供状态,当状态等于“已下载”时,我们需要向用户显示通知以重新启动应用程序。
注册听众
在开始更新之前,首先注册侦听器,如以下代码所示:
// Before starting an update, register a listener for updates.
appUpdateManager.registerListener(listener)
取消注册监听器
当不再需要该侦听器时,我们需要注销该侦听器,以避免内存泄漏。像下面的代码:
// When status updates are no longer needed, unregister the listener.
appUpdateManager.unregisterListener(listener)
注意:仅灵活下载才需要监视更新状态
步骤6:完成“弹性模式”更新
监视更新状态后,您将检测到InstallStatus.DOWNLOADED
状态。现在,您需要重新启动应用程序以安装更新,为此,我们只需要 completeUpdate()
像下面的代码片段一样调用函数即可:
appUpdateManager !!。completeUpdate()
完全更新后,该应用程序将重新启动,现在您处于该应用程序的新版本中。
步骤7:监视即时模式更新
现在,在上面的步骤中,我们监视了更新状态并处理了案例,对于Flexible更新模式,现在在此步骤中,我们需要处理立即模式更新状态。
如果用户将模式设置为“Immediate”,则Google Play将显示全屏UI,并且用户无法与该应用进行交互,并且在更新开始后,更新将在后台开始,在此期间,如果用户离开该应用,再次回来,我们必须显示更新的进度,如下面的代码片段所示。
// Checks that the update is not stalled during 'onResume()'.
// However, you should execute this check at all entry points into the app.
override fun onResume() {
super.onResume()
appUpdateManager
.appUpdateInfo
.addOnSuccessListener { appUpdateInfo ->
...
if (appUpdateInfo.updateAvailability()
== UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
) {
// If an in-app update is already running, resume the update.
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
IMMEDIATE,
this,
MY_REQUEST_CODE
);
}
}
}
在上面的代码中,我们需要在onResume()方法中进行检查,如果mode为Instant&当您的应用返回到前台时,您应该确认更新没有停滞在该UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS
状态。如果更新在这种状态下停顿,请恢复更新,如上面的代码所示.
步骤8:处理取消更新。
如果用户在更新期间或请求下载之前取消更新。因此,不必担心我上面提到的重写方法,OnActivityResult
在s tartUpdateFlowForResult方法中,我们传递了REQUEST_CODE参数。
因此,当用户取消调用更新onActivityResult时,在此重写方法中,我们具有以下三个回调:
RESULT_OK
:用户已成功接受更新。RESULT_CANCELED
:用户已取消更新。ActivityResult.RESULT_IN_APP_UPDATE_FAILED
:发生了其他错误或应用程序内更新失败。
fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { // super.onActivityResult(requestCode, resultCode, data) if (requestCode == InAppUpdateConstant.REQUEST_CODE) { when (resultCode) { Activity.RESULT_OK -> { Log.d(TAG, "" + "Result Ok") // handle user's approval } } Activity.RESULT_CANCELED -> { { //if you want to request the update again just call checkUpdate() } Log.d(TAG, "" + "Result Cancelled") // handle user's rejection } } ActivityResult.RESULT_IN_APP_UPDATE_FAILED -> { //if you want to request the update again just call checkUpdate() Log.d(TAG, "" + "Update Failure") // handle update failure } } } }
注意:该对话框将仅在生产版本中显示,而不在Beta版本中显示。
测试方法:
现在,最后一件事是如何进行测试,这是一个棘手的部分,需要遵循以下测试要点。
我将其分为两部分。
第1部分
- 生成用于生产的签名APK。
- 转到App-Internal-Sharing,然后将构建内容上传到该处,并与测试人员共享链接
- 现在使用共享链接安装该版本。
第2部分
- 生成带有其他版本代码和版本名称的经过签名的正式版APK,请确保您之前上传的版本低于此版本。
- 转到App-Internal-Sharing,然后将构建内容上传到该处,然后与测试人员共享链接。
- 现在,单击该链接,不要单击“更新”按钮。
- 现在,只需打开先前安装的应用程序,您将看到更新对话框。
每次上传Build时,请确保关闭Google Play商店应用