Android finish()和System.exit之间的差异(0)

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。 (我仅在这两个设

我说的是android编程

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

但我错了。 我做了一个小实验,了解到两者都只能完成当前的活动


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

  • 使用
    finish()。而对于
    系统退出(0)
    未调用
    onActivityResult()
但是在Android 4.2.2中,两个都调用了onActivityResult()!而exit()的Intent为null。 (我仅在这两个设备中进行了测试)

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

所以

  • 这两者有什么区别

  • 在哪些情况下,我可以使用exit()

  • 我相信在这两种方法之间我还缺少一些东西。 希望有人能多解释,纠正我

    谢谢

    按要求编辑:

    制作一个包含2个活动的Android应用程序。使用Intent从启动器活动调用第二个活动。现在,在第二个活动中,单击一个按钮,调用
    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和应用程序实例仍然处于活动状态。