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

Niz*_*zam 35 android activity-finish

我在谈论android中的编程.

在早期我想,finish() 关闭当前活动并返回活动堆栈中的上一个,并System.exit(0) 关闭整个应用程序.

但是我错了.我做了一个小实验并且明白两者都只完成当前的活动.


我能注意到的唯一区别是,在Android 2.3.3中

  • ActivityResult传播回onActivityResult()finish().而 onActivityResult()不是要求System.exit(0).

但是在Android 4.2.2中,两者都调用了onActivityResult()!对于exit(),Intent为null.(我只测试了这2个设备)

  • 使用退出(),而当有一个时间滞后finish()更快的.(好像更多后台操作是否有退出())

所以,

  1. 两者有什么区别?

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

我相信在这两种方法之间我还缺少一些东西.希望有人可以解释更多并纠正我.

谢谢

编辑请求:

制作包含2项活动的Android应用程序.使用Intent从Launcher活动中调用第二个Activity.现在,在第二个活动中,点击一下按钮,就可以了System.exit(0);." VM停止进一步执行,程序将退出. "????(根据文档)

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

Aya*_*fov 23

实际上,如果您只有一项活动,则没有区别.但是,如果堆栈上有多个活动,则:

  • finish() - 完成调用它的活动,你会看到之前的活动.
  • System.exit(0) - 在堆栈上少一个活动重新启动应用程序.因此,如果您从ActivityA调用ActivityB,并System.exit(0)在ActivityB中调用,那么应用程序将被杀死并立即启动,只有一个活动ActivityA

  • 即使您只有一项活动,实际上也有很大的区别。`System.exit()` 关闭虚拟机,因此存储在静态变量、单例和 JNI 代码保留的堆内存中的所有内容都将被清除。当完成应用程序中的唯一活动时,不会发生这种情况,因为虚拟机和您的应用程序实例仍然处于活动状态。 (2认同)

mjo*_*osh 13

根据android开发者 -

finish()

在您的活动完成后调用此选项并应关闭.ActivityResult会传播回通过onActivityResult()启动您的人.

System.exit(0)

VM停止进一步执行,程序将退出.

  • 如果堆栈上有多个活动,System.exit()不会终止您的应用程序.请检查一下. (9认同)
  • @Nizam:"如果您在堆栈上有多个活动,"System.exit()不会终止您的应用程序" - 欢迎您通过上传展示此活动的应用程序提供您的声明该流程未终止的证据行为,以及您确认该流程未终止的步骤. (7认同)
  • @CommonsWare我没有说过程没有终止.我不知道里面发生了什么.在抽象中,无论我在活动中使用finish()还是exit(),都会显示上一个活动.这就是我的意思是app没有被杀死. (6认同)
  • @CommonsWare:如果我错了,请纠正我.见上面的答案.我用"杀死"而不是"退出". (3认同)
  • @Nizam:"这就是我的意思,应用程序没有被杀死" - 然后欢迎提供证据证明文件曾声称`System.exit()`会导致应用被"杀死",无论你有什么定义"被杀" (2认同)

小智 9

根据文档,该程序将退出.
但它似乎是文档中的一个错误.在java程序的情况下,它是正确的.但是进入Android,您将从堆栈中看到之前的Activity.

由于Android编码是使用java编码完成的,因此大多数文档都与java相同.
从文档,

System.exit(0)
VM停止进一步执行,程序将退出.

对于Android方面,我们必须用其他东西替换"程序"这个词.可能是活动或上下文.