Android finish()和System.exit之间的差异(0)
我说的是android编程 早期我认为,Android finish()和System.exit之间的差异(0),android,activity-finish,Android,Activity Finish,我说的是android编程 早期我认为,finish()关闭当前活动并返回到活动堆栈中的上一个,然后System.exit(0)关闭整个应用程序 但我错了。 我做了一个小实验,了解到两者都只能完成当前的活动 我能注意到的唯一区别是,在Android 2.3.3中 使用finish()。而对于系统退出(0)未调用onActivityResult() 但是在Android 4.2.2中,两个都调用了onActivityResult()!而exit()的Intent为null。 (我仅在这两个设
finish()
关闭当前活动并返回到活动堆栈中的上一个,然后System.exit(0)
关闭整个应用程序
但我错了。
我做了一个小实验,了解到两者都只能完成当前的活动
我能注意到的唯一区别是,在Android 2.3.3中
- 使用
finish()。而对于
未调用系统退出(0)
onActivityResult()
- 使用exit()时会有一个时间延迟,而
速度更快(似乎exit()中有更多的后台操作)finish()
所以
System.exit(0)代码>。
“虚拟机停止进一步执行,程序将退出。”??(根据)
我在那里看到了第一个活动。为什么?
(欢迎你证明我错了/我是对的)根据android开发者的说法-
finish()
当您的活动完成并应关闭时调用此选项。这个
ActivityResult将传播回通过
onActivityResult()
System.exit(0)
VM停止进一步执行,程序将退出
根据文档,程序将退出。
但这似乎是文档中的一个bug。对于java程序,它是正确的。但是来到Android,您将从堆栈中看到前面的活动。
由于Android编码是使用java编码完成的,因此大多数文档与java相同。
根据文件
系统退出(0)
VM停止进一步执行,程序将退出。
对于Android方面,我们必须用其他东西替换单词'program'。可能是活动或上下文。如果只有一个活动,实际上没有区别。但是,如果堆栈上有多个活动,则:
- finish()-在调用活动的位置完成该活动,您将看到上一个活动
- 系统。退出(0)-以堆栈上少一个活动的方式重新启动应用程序。因此,如果您从ActivityA调用ActivityB,并且在ActivityB中调用了
System.exit(0)
,则应用程序将被终止并立即启动,而只有一个ActivityA
经过我的测试,Sa Qada的答案是正确的
finish将关闭此活动并返回到prevous
但退出也将关闭当前活动,清空冻结中的所有活动,并再次启动上一个活动
事实上,如果你只有一项活动,就没有区别。
但是,如果堆栈上有多个活动,则:
finish()-完成从中调用的活动,您可以看到
前面的活动。System.exit(0)-使用一个重新启动应用程序
堆栈上的活动更少。那么,如果你从
在ActivityB中调用System.exit(0),然后
应用程序将被终止并立即启动,只有一个
活动A
. 核对答案here@Raghunandan:那是个好主意。请大家看一看。但是大量的信息。有人能简单地告诉我适合我的主题吗?永远不要使用System.exit()。使用finish()
。对于导航,您可以使用导航抽屉。这很有趣。为什么应用程序没有按文档所述关闭?关于为什么不应使用System.exit(0)的优秀文章:。如果堆栈上有多个活动,System.exit()不会终止应用程序。请检查。@Nizam:“如果堆栈上有多个活动,System.exit()不会终止您的应用程序”--欢迎您上传一个演示此行为的应用程序,以证明进程未终止,以及您为确认进程未终止而采取的步骤。@commonware我没有说过进程未终止。我不知道里面发生了什么。在抽象中,无论我在活动中使用finish()还是exit(),都会显示前面的活动。这就是我所说的应用程序未被杀死的意思。@Nizam:“这就是我所说的应用程序未被杀死的意思”——那么,欢迎您提供证据,证明文档曾声称,System.exit()
会导致应用程序被“杀死”,无论您对“杀死”有什么定义。@commonware:如果我错了,请纠正我。见上面的答案。我用了“杀死”而不是“退出”。实际上,即使你只有一个活动,也会有很大的不同System.exit()
关闭VM,因此存储在JNI代码保留的静态变量、单例和堆内存中的所有内容都将被清除。在完成应用程序中的唯一活动时不会发生这种情况,因为VM和应用程序实例仍然处于活动状态。