finish()和System.exit(0)的区别

45

我正在谈论在安卓中的编程问题。

早些时候,我认为finish()会“关闭当前活动”并返回到活动堆栈中的前一个活动,而System.exit(0)则“关闭整个应用程序”。

但是我错了。 我做了一个小实验,发现两者都只会结束当前活动


我能够注意到的唯一区别在于,在Android 2.3.3中:

  • 使用finish()将ActivityResult传回到onActivityResult()。退出时onActivityResult()不被调用。

然而,在Android 4.2.2中,对于两者onActivityResult()都会被调用!并且Intent在exit()的情况下为null。(我只在这两个设备上测试过)

  • 使用exit()会有时间延迟,而finish()速度更快。(似乎退出操作中有更多的后台操作)

所以,

  1. 两者之间有什么区别?

  2. 在哪些情况下,我可以使用exit()?

我相信我在两种方法之间还遗漏了一些东西。 希望有人能够更好地解释并纠正我。

谢谢

根据请求进行编辑:

创建一个安卓应用程序,其中包含两个活动。使用Intent从Launcher活动中调用第二个活动。现在,在第二个活动中,通过单击按钮调用System.exit(0);。 根据文档,“VM将停止进一步执行,程序将退出”。

我看到了第一个活动。为什么? (欢迎您证明我是错的/我是对的)


1
请查看此处的答案:https://dev59.com/w3I-5IYBdhLWcg3wED5V。 - Raghunandan
@Raghunandan:这个不错。大家请看一下。但是信息量很大。有人能简要地告诉我如何适应我的主题吗? - Nizam
4
不建议使用System.exit(),可以使用finish()。对于导航,可以使用导航抽屉。 - Raghunandan
这很有趣。为什么应用程序没有像文档所述那样关闭? - user3137768
关于为何不应该使用 System.exit(0) 的优秀文章:A cautionary tale on Android: do not call System.exit() - Sufian
4个回答

37

如果你只有一个活动,那么实际上没有任何区别。但是,如果你在栈中有几个活动,则:

  • finish() - 结束调用该方法的活动,并显示上一个活动。
  • System.exit(0) - 重新启动应用程序并从堆栈中少了一个活动。因此,如果你从ActivityA调用了ActivityB,然后在ActivityB中调用了System.exit(0),则应用程序将被杀死,并立即以只有一个活动ActivityA重新启动

2
即使您只有一个Activity,实际上仍存在很大的区别。System.exit()会关闭VM,因此存储在静态变量、单例和被JNI代码保留的堆内存中的所有内容都将被清除。当结束应用程序中唯一的Activity时,这种情况不会发生,因为VM和您的Application实例仍然存在。 - Tenfour04

14
根据安卓开发者所述 - < p > < code>finish()

< blockquote>

调用此方法时,表示您的活动已完成并应关闭。 ActivityResult 通过 onActivityResult()方法传递回启动您的人。

< p >< code>System.exit(0)

< blockquote>

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


10
如果您的应用程序在堆栈上有多个活动,则System.exit()无法关闭您的应用程序。请检查一下。 - Nizam
9
@Nizam:“如果您的堆栈中有多个活动,则 System.exit() 不会终止您的应用程序”-- 您可以提供证明您声明的进程未被终止的证据,以及展示此行为的应用程序和确认进程未被终止的步骤。 - CommonsWare
7
@CommonsWare,我并没有说进程没有终止。而且我也不知道里面发生了什么。抽象地说,无论我在一个活动中使用finish()还是exit(),上一个活动都会显示出来。这就是我所说的应用程序没有被杀死的意思。 - Nizam
2
@Nizam:“这就是我所说的应用程序没有被杀死的意思”--那么您可以提供证据,证明文档曾经声称System.exit()会导致应用程序被“杀死”,无论您对“杀死”的定义是什么。 - CommonsWare
3
请纠正我如果我说错了。请看上面的答案。在那里,我使用了“killed”而不是“exit”。 - Nizam
显示剩余5条评论

9
根据文档,程序将退出。
但是文档中似乎存在一个错误。对于Java程序来说,这是正确的。但是在Android上,您将看到堆栈中的上一个Activity。
由于Android编码使用java编码完成,因此大部分文档与Java文档相同。
从文档中得知:
System.exit(0)
VM停止进一步执行并退出程序。

对于Android方面,我们必须用其他东西替换“program”这个词。也许是Activity或Context。

3

Sa Qada的回答在我的测试后是正确的。

finish将关闭此活动并返回上一个活动。

但exit也将关闭当前活动并清空所有处于冻结状态的活动,然后重新开始之前的活动。

实际上,如果你只有一个活动,那么没有区别。但是,如果你在堆栈中有多个活动,则:

finish() - 结束从中调用它的活动,并显示先前的活动。System.exit(0) - 重新启动应用程序,堆栈中的活动数减少一个。因此,如果你从ActivityA调用ActivityB,并且在ActivityB中调用了System.exit(0),则应用程序将被终止并立即重新开始,只有一个ActivityA活动。


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