2

在一个正在运行的 Android 应用程序中,我想请求同一个应用程序 (1) 从我的私人 Web 服务器重新下载,(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
}

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

在重新安装后,我可以通过编程方式强制应用程序自动重新启动吗?

4

2 回答 2

6

我想出了如何在重新安装后重新启动应用程序。如果它对其他人有帮助,这就是我的做法(注意在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
}

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

于 2013-03-25T21:14:36.340 回答
0

幸运的是,这在 Android 3.1 及更高版本上是不可能的;您不能简单地在安装时启动应用程序。具体来说,Mark Murphy 详细阐述:

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

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

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

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

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

于 2013-03-24T16:07:08.987 回答