【问题标题】:Android app behaving unexpectedly after calling System.exit(0)Android 应用程序在调用 System.exit(0) 后行为异常
【发布时间】:2013-07-27 15:55:06
【问题描述】:

我正在编写一个包含 4 个活动的简单应用程序。我会快速描述它,以便您了解我想要实现的目标。

第一个活动 - MainActivity 有一些 TextEdit 字段,这些字段收集 2 个输入参数 - 代表次数和暂停时间(以秒为单位)。一个按钮将我带到第二个活动: WorkActivity - 所有这一切都是它开始计数,直到我按下“完成”,然后它调用 PauseActivity,或者如果它是最后一个代表,调用 OverviewActivity。 PauseActivity 倒计时直到下一次代表,然后向我发出哔哔声,让我知道时间到了,并再次显示 WorkActivity。 OverviewActivity 显示每个代表的总锻炼时间和时间。

它还有一个按钮,应该只是结束应用程序。我知道退出您的应用程序并不真正符合 Android 应用程序生命周期理念,但我需要它(或类似的事情发生)。 我有一个单例控制器类,可以跟踪代表并记录时间。我可以杀死这个实例(或假装它的死亡,因此将创建一个新实例),但是当我“关闭”应用程序然后再次单击它时,我得到的是 OverviewActivity 而不是预期的 MainActivity。

我希望调用 System.exit(0) 会解决问题,只需关闭应用程序,因此再次运行时必须重新初始化。相反,整个事情开始表现得非常愚蠢。当我单击调用 System.exit(0) 的按钮时,我的应用程序不会消失,而是重新启动。它显示了 WorkActivity,并开始计数。当我单击完成按钮(应该带我到 PauseActivity)时,我得到一个异常。应用程序崩溃 - 然后再次重新启动。这将重复,直到我点击主屏幕按钮,并且应用程序保持这种无用状态,直到我在应用程序管理器中将其杀死。

另外,我不太确定,但我认为 System.exit(0) 调用(或随后的崩溃)会断开调试器,因为之后我无法让 Eclipse 命中任何断点。这意味着我无法真正看到发生的实际异常。

有人可以解释一下吗?有没有办法正确使用 System.exit(0)?

如果没有此选项,处理此问题的正确方法是什么? 我需要该应用程序: - 当我点击最后一个“完成”按钮时,主页按钮或返回按钮,处理控制器,(如果可能的话,还有其他所有东西),停止计数(如果有任何计时器正在运行)并基本上自行关闭) - 当我再次单击应用程序的图标时,向我显示一个新实例(或一个新实例),其中 MainActivity 以问候我以及所有其他处于默认状态的活动。

【问题讨论】:

    标签: android android-activity exit


    【解决方案1】:

    使用 System.exit(0) 是一种不好的做法。

    在这种情况下调用 exit() 会终止进程,杀死你的 其他组件并可能损坏您的数据。操作系统可以 当然不太在意,但您的用户可能不会欣赏它。

    自愿杀死你的进程不会帮助其他应用程序,如果 他们已经用尽了内部的 Dalvik 堆限制。不管怎样 设备有多少物理内存,操作系统对多少有限制 内存 Dalvik 被允许在任何进程中用于堆分配。 因此,系统可能有一半的空闲内存和一个 特定应用程序仍会出现 OOM。

    不要使用 System.exit(0);相反,您可以只使用finish()。

    Intent intent = new Intent(this, Activity2.class);
    startActivity(intent);
    finish();
    

    【讨论】:

    • 我明白了。那么如何确保在用户下次单击应用程序图标时显示我的 MainActivity 呢?以及如何让我的应用在本应“退出”时消失?
    • 您从 AndroidManifest 设置您的主要活动,如下所示 并使其消失,使用 finish(); - 完成将“终止”一个活动
    • 这就是我在 AndroidManifest 中的内容:。它是由 Eclipse 以这种方式设置的。此外,正如我之前所说,我有 4 个活动,最后调用 finish() 只会导致其他活动之一出现。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-18
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多