调用System.exit(0)后Android应用程序意外运行

时间:2013-07-27 15:55:07

标签: android android-activity exit

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

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

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

我预计调用System.exit(0)会处理事情,只需关闭应用程序,因此在重新运行时必须重新初始化。相反,整个事情开始表现得非常狡猾。当我单击调用System.exit(0)的按钮时,而不是消失我的应用程序重新启动类型。它显示了WorkActivity,并开始计数。当我单击完成按钮(应该将我带到PauseActivity)时,我得到一个例外。应用程序崩溃 - 然后再次重新启动。这将重复,直到我点击主屏幕按钮,应用程序仍处于无用状态,直到我在应用程序管理器中将其终止。

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

有人可以对此有所了解吗?有没有办法正确使用System.exit(0)?

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

1 个答案:

答案 0 :(得分:5)

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

  

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

     

如果您自愿杀死您的流程将无法帮助其他应用程序   他们已经用尽了他们内部的Dalvik堆限制。不管怎样   一个设备有很多物理内存,操作系统有多少限制   内存Dalvik允许在任何进程中使用堆分配。   因此,系统可能有一半的内存和一半   特定的应用程序仍然打击OOM。

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

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