android - 以编程方式安装新版本的 Android 应用程序

标签 android performance apk android-install-apk android-update-app

故事 现在我正在开发一个项目,其中一个 Android 应用程序在自定义设备上运行,并且该应用程序不是通过 Play 商店安装的,而是手动上传、安装并在设备上启动的 APK 文件。

问题这里是当新版本发布时我们必须在所有设备上手动更新应用程序。

我们希望自动化这个过程并像这样构建过程:

  • 安装应用
  • 启动应用
  • 启动后台进程以检查服务器中的新版本
  • 下载新的 APK 文件
  • 卸载当前应用/更新应用
  • 安装新应用/更新应用

问题:

我们能否以编程方式卸载和安装 APK 文件?

Shell 我们使用现有的应用程序来完成这项工作,还是创建一个新的 Android 应用程序来处理新版本检查并在后台更新应用程序?

最佳答案

不要卸载 APK,而是将更新后的 APK 文件放在您的服务器上,然后将其下载到您的应用程序中。

使用下面的函数安装应用

fun install(context: Context, packageName: String, apkPath: String) {

// PackageManager provides an instance of PackageInstaller
val packageInstaller = context.packageManager.packageInstaller

// Prepare params for installing one APK file with MODE_FULL_INSTALL
// We could use MODE_INHERIT_EXISTING to install multiple split APKs
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL)
params.setAppPackageName(packageName)

// Get a PackageInstaller.Session for performing the actual update
val sessionId = packageInstaller.createSession(params)
val session = packageInstaller.openSession(sessionId)

// Copy APK file bytes into OutputStream provided by install Session
val out = session.openWrite(packageName, 0, -1)
val fis = File(apkPath).inputStream()
fis.copyTo(out)
session.fsync(out)
out.close()

// The app gets killed after installation session commit
session.commit(PendingIntent.getBroadcast(context, sessionId,
        Intent("android.intent.action.MAIN"), 0).intentSender)
}

更新后重启应用

class UpdateReceiver : BroadcastReceiver() {

override fun onReceive(context: Context, intent: Intent) {

    // Restart your app here
    val i = Intent(context, MainActivity::class.java)
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    context.startActivity(i)        
}
}

在后台静默更新应用程序的完整过程在下面的链接中描述

https://www.sisik.eu/blog/android/dev-admin/update-app

关于android - 以编程方式安装新版本的 Android 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708541/

相关文章:

c# - "in"关键字对引用类型有什么好处吗?

android - 如何编译 Youtube WatchMe?

android - 错误版本发布APK

android - 用于 fragment 的 JUnit

java - 当所有数据都存储在设备上时创建强密码方案

android - 为 Android View 设置 OnClick()

python-3.x - 如何有效地在矩阵中获得一种 "maximum"

MySQL - 大型数据库,提高搜索时间

android - Google Play 上传失败,因为 google play 服务版本问题

android - 我如何在 jdk.7.o 中获取 MD5 哈希值?