在正在运行的Android应用程序中,我想请求同一个应用程序(1)从我的私人Web服务器重新下载,(2)重新安装自己,然后(3)重新安装后重新启动。
我知道如何执行第1步和第2步,但我还没弄清楚如何执行第3步。
下载后,我会像这样执行第2步( this.apkpath 之前已经设置为我SD卡上下载的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
}
此代码成功后,屏幕上会弹出安装确认对话框,并在此确认后重新安装。但是,安装后,控制权返回到我的桌面管理器,我必须手动重新启动我重新安装的应用程序。
在重新安装后,我可以通过编程方式强制应用程序自动重启?
答案 0 :(得分: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
}
当我运行它时,我在安装对话框后得到一个打开的请求对话框。然后我可以单击“打开”,应用程序确实会重新启动。这足以满足我的需求。
答案 1 :(得分:0)
幸运的是,这在Android 3.1及更高版本中是不可能的; you cannot simply start an application on installation。具体而言,Mark Murphy详细说明:
用户必须首先通过某种活动调用应用程序。或者,您将需要通过清单挂钩一些相关的广播
Intent
,以便您可以在其中一个事件发生时获得控制权并以此方式启动您的服务。或者,您需要让用户重新启动,以便BOOT_COMPLETED
Intent
过滤器可以获得控制权。
换句话说,您可以挂钩BOOT_COMPLETED
然后启动应用程序,但这显然需要重新启动。
我建议回到绘图板并重新考虑你在这里想要完成的事情。如果你真的开始采用这种特定的方法,那就有this crummy workaround,但我恳请你不要走那条路。
另一种方法可能是通过AlarmManager
安排事件。我不确定在重新安装应用程序时是否删除了事件。
(我写“幸运的是”,因为这种行为是恶意软件的恶意使用,也不符合用户的意图。)