【问题标题】:How to force quit the Android app and restart it? [duplicate]如何强制退出Android应用程序并重新启动它? [复制]
【发布时间】:2011-06-29 22:58:45
【问题描述】:

我的 Android 应用有一个需要 Flash 插件的WebView。如果未安装,webview 将提供指向 Adob​​e Flash 的市场链接。安装 Flash 后,在我的应用程序中实例化它的唯一方法是强制退出并重新启动应用程序。我想向为他们执行此操作的用户提供一个按钮,因为临时用户打开他们正在运行的进程并手动强制退出应用程序太复杂了。实现这种重启按钮的Java代码是什么?

【问题讨论】:

  • 为什么你需要强制退出并重新启动你的应用程序来初始化?安装flash后再次调用初始化代码..
  • 您真的需要强制关闭应用程序本身吗?仅仅关闭托管 WebView 的 Activity 还不够吗?
  • 如果应用没有重新启动,WebView 的 Javascript 将无法找到 Flash。我可以根据需要重新实例化 WebView 并重置其插件,但在重新启动应用程序之前它不会拾取 Flash。
  • 在 Android 4.3 下将网页重新加载到 WebView 后,我看到了类似的 javascript 间歇性无法运行的问题。这个问题在 4.4 中消失了,可能是因为谷歌用 chrome 替换了 WebView 的胆量。几周以来我一直在寻找解决方法——我会尝试一下——有时问题需要一两天才能出现。

标签: java android


【解决方案1】:

您可以分两步重启应用:

  1. 杀死自己的进程。采用 Process.myPid(),传入 Process.killProcess()。您可能需要向清单添加权限(可能是 android.permission.KILL_BACKGROUND_PROCESSES)才能使其正常工作。
  2. 在您终止自己的进程之前,注册一个带有待定意图的警报,以便在不久的将来重新启动您的活动。 alarm.set 的第二个参数是 triggerAtTime。将其设置为 0 会导致警报立即触发。此处的示例设置了在未来一秒后启动应用的时间。

代码如下:

AlarmManager alm = (AlarmManager) this.getSystemService(Context.ALARM_SERVICE);
alm.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, PendingIntent.getActivity(this, 0, new Intent(this, this.getClass()), 0));

【讨论】:

  • 如何从我的主要Activity 中访问这个Process 对象?
  • Process 上的这些方法是静态的。你应该可以打电话给他们。
  • 是的,这行得通。我们有一个管理按钮,可以在调用 Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL) 之前彻底关闭各种操作
  • @mportuesisf 。现在我有一个alarm.set(),后跟一个Process.killProcess()。如何在进程被杀死之后触发警报?我已将0 替换为System.currentTimeMillis() + 1000,但我没有看到活动在1 秒后重新启动。也许当进程被杀死时,它的所有警报也都被清除了。
  • 尝试将常量AlarmManager.ELAPSED_REALTIME 更改为AlarmManager.RTCRTC 是 UTC 挂钟时间,ELAPSED_REALTIME 是自启动以来的时间。 (您可能还需要将时区调整为 UTC)。
【解决方案2】:

我想您可以致电 finish 停止您的活动,但您将无法让您的应用重新启动。那将需要(如果可能的话)root,这将是一个糟糕的主意。这意味着任何应用程序都可以随时自行启动:这只是一个坏主意,如果可能的话实际上是一个错误。

【讨论】:

  • Activity.finish 是否真的强制退出应用程序?似乎它只将应用程序存储在内存中。当我运行代码时,它确实关闭了应用程序。但是当我去管理应用程序时,“强制停止”按钮仍然被激活。如果在内存中找不到应用程序,则应禁用该按钮。出于某种原因,Flash 要求应用程序内存不足,然后重新启动才能被WebView 识别。
  • @JoJo:Activity.finish 只关闭当前活动。您完成了应用程序中的所有活动还是仅完成了一项?因为如果任何活动或后台进程仍然存在,那么应用程序自然也会存在。
  • 我在Activity.onCreate 的末尾添加了this.finish()。因此,当您启动应用程序时,它会立即关闭。这不应该导致唯一的活动被关闭吗?
  • @JoJo:是的,应该可以。我不知道为什么它没有关闭没有活动的应用程序。您使用的是哪个版本的 Android?
  • 我实际上在 2.2(摩托罗拉 Droid (1))上看到了类似的行为。调用 finish() 会退出活动,但它仍会显示在“正在运行的应用程序”下。此外,“强制停止”按钮似乎没有任何作用。
【解决方案3】:

您可以使用 System.exit(0) 退出应用程序:这不需要您的应用程序的权限

【讨论】:

    猜你喜欢
    • 2013-06-18
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 2020-09-24
    • 1970-01-01
    • 2012-12-01
    • 2012-09-15
    相关资源
    最近更新 更多