当执行System.exit(0)时会发生什么?

4

我有两个不同的活动。第一个启动第二个。

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

在第二个活动中,我调用了System.exit(0)。 我认为第一个活动是由“页面堆栈”引起的。 但我发现了两件事情。
  1. 正在进行的变量失去了它的值。(我认为进度重启了)
  2. 在第一个活动中创建的文件,在第二个活动中附加数据并保存后被删除了!(从沙箱中擦除)。我使用applicationContext.openFileOutput(fileName, Context.MODE_PRIVATE);创建的文件。
在那种情况下沙盒是否被清理了?通过“返回键”或甚至android.os.Process.killProcess(android.os.Process.myPid())进行正常退出时,沙箱中的文件保持不变。 所以,当执行System.exit(0)时,实际上发生了什么?
谢谢!

你为什么不使用finish()呢? - Seshu Vinay
4个回答

9

你可以这样做:

不使用 System.exit(0);,而是直接使用如下代码:finish();

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

在这里,数据不会丢失。HTH :)

1
我在第二个活动中调用了System.exit(0)。我知道这不是一个好的退出方式,但我只是想知道如果我这样做会发生什么。 - Kane
@JinZhang 它将终止当前正在运行的JVM。 - Android Killer
这会导致文件丢失吗? - Kane
@jin Zhang 如果使用非持久化方式,那么任何临时数据都将会丢失。但是如果你正在使用文件中的数据并将其存储,那么你可以再次读取它。 - Android Killer

2

当执行System.exit(0)时会发生什么?

虚拟机停止进一步的执行,程序将退出。

现在,在您的情况下,由于活动堆栈,第一个活动会回来。因此,当您使用Intent从一个活动移动到另一个活动时,请像这样完成当前活动的finish()

Intent intent=new Intent(getApplicationContext(), NextActivity.class);
startActivity(intent);
CurrentActivity.this.finish();

这将确保在关闭应用程序时没有运行的活动。

要退出应用程序,请使用以下代码:

MainActivity.this.finish();          
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

如果您的应用程序在后台使用任何资源,例如从后台播放音乐的音乐播放器,或者使用后台互联网数据的任何应用程序,或者任何依赖于您的应用程序的小部件,则不应使用 System.exit()

有关更多信息,请参考以下参考资料:

  1. 退出应用程序是否被反对?
  2. http://android-developers.blogspot.in/2010/04/multitasking-android-way.html

1
这解决了我的问题。感谢您的分享。 - Arthur Wang


0
所以,当执行System.exit(0)时,实际上会发生什么?
android.os.Process.killProcess(android.os.Process.myPid())和System.exit(0)是相同的。当你从第二个活动调用它们中的任何一个时,应用程序将关闭并再次打开,只有一个活动(我们假设你有2个活动)。您可以通过在主要活动的onCreate方法中放置日志(Log.i("myTag", "MainActivity started");)来检查此行为。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接