【问题标题】:Reinstall running android app's own APK and then restart app?重新安装正在运行的android应用程序自己的APK,然后重新启动应用程序?
【发布时间】:2023-07-15 15:38:01
【问题描述】:

在一个正在运行的 Android 应用程序中,我想请求同一个应用程序 (1) 从我的私人网络服务器重新下载,(2) 重新安装,然后 (3) 在重新安装后重新启动。

我知道如何执行第 1 步和第 2 步,但我还没有弄清楚如何执行第 3 步。

下载后,我像这样执行第 2 步(其中 this.apkpath 之前已设置为我 sdcard 上下载的 APK 的完整路径名):

try {
  Intent intent = new Intent(Intent.ACTION_VIEW);
  intent.setDataAndType(Uri.fromFile(new File(this.apkpath)),
                        "application/vnd.android.package-archive");
  this.activity.startActivity(intent);
}
catch (Throwable t) {
  // handle exceptions
}

此代码成功后,我的屏幕上会弹出一个安装确认对话框,并在此确认后重新安装。但是,安装后,控制权返回到我的桌面管理器,我必须手动重新启动我新重新安装的应用程序。

如何以编程方式强制应用在重新安装后自动重启?

【问题讨论】:

    标签: android download apk application-restart reinstall


    【解决方案1】:

    我想出了如何在重新安装后重新启动应用程序。如果它对其他人有帮助,我是这样做的(注意在 startActivity 之前添加的“addFlags”方法调用):

    try {
      Intent intent = new Intent(Intent.ACTION_VIEW);
      intent.setDataAndType(Uri.fromFile(new File(this.apkpath)),
                           "application/vnd.android.package-archive");
      // Add this line ...
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      this.activity.startActivity(intent);
    }
    catch (Throwable t) {
      // handle exceptions
    }
    

    当我运行它时,我会在安装对话框之后看到一个打开的请求对话框。然后我可以单击“打开”,该应用程序确实会重新启动。这足以满足我的需求。

    【讨论】:

    • 非常好!我已经用 ICS 进行了测试,它可以工作。它适用于 Jelly Beans 或 Kit Kat 吗?
    • 有什么方法可以默默地做到这一点?
    • 另外,点击打开不是“自动重启”
    【解决方案2】:

    幸运的是,这在 Android 3.1 及更高版本上是不可能的; you cannot simply start an application on installation。具体来说,Mark Murphy 详细阐述:

    应用程序必须首先由用户通过某种活动来调用。或者,您将需要通过清单连接到一些相关的广播Intent,这样您就可以在其中一个事件发生时获得控制并以这种方式启动您的服务。或者,您需要要求用户重新启动,以便您的 BOOT_COMPLETED Intent 过滤器可以控制。

    换句话说,您可以连接到BOOT_COMPLETED 并启动您的应用程序,但这显然需要重新启动。

    我建议回到绘图板并重新考虑您要在这里完成的工作。如果你真的打算采用这种特定的方法,有this crummy workaround,但我敦促你不要走那条路。

    另一种方法可能是通过AlarmManager 安排活动。我不确定重新安装应用程序时是否会删除事件。

    (我写“幸运”,因为这种行为会招致恶意软件的恶意使用,而且也不符合用户的意图。)

    【讨论】:

    • 谢谢你,保罗,但我想出了如何做到这一点。请参阅我在上面添加的“addFlags”行。它会在安装对话框后弹出一个打开的对话框。那时,我选择“打开”,然后我的应用程序重新启动。这足以满足我的需求。
    • 很高兴听到这个消息!您应该将更改移动到单独的答案中并将其标记为已回答,以便遇到相同问题的其他人可以看到问题是什么以及如何解决。
    • 是的,我会在 5 到 6 小时内转移更改,届时此处的软件允许我回答我自己的问题。
    最近更新 更多