【问题标题】:What happens when all activities of an application finishes?当应用程序的所有活动完成时会发生什么?
【发布时间】:2013-03-10 18:33:09
【问题描述】:

场景:

我的 Android 应用程序中有四个活动,比如说 A、B、C 和 D。应用程序中有一个 Constants.java 类扩展 Application 类以维护全局应用程序状态。 Constants 类具有应用程序的所有常量变量。活动流程是这样的A-->B-->C-->D。当从活动 A 按下后退按钮时,我正在调用 finish() 方法,该方法将完成活动 A 并关闭应用程序。之后,如果我从所有应用程序中打开应用程序,Constants.java 中有一个变量,其值从上次启动时仍然存在。当我在活动 A 中执行 System.exit(10) 后跟 Process.killProcess(Process.myPid()) 时,同样的事情不会发生(在后按时)。

问题:

  1. 通过调用每个活动的finish()来完成所有活动是否会关闭应用程序(其进程)?
  2. 即使变量的所有活动都已完成(关闭),变量的值如何保持不变?
  3. 调用System.exit(10) 后跟Process.killProcess(Process.myPid()) 退出应用程序是否公平?

更新:

如何在应用程序退出时清除应用程序常量(返回 HomeActivity)?

【问题讨论】:

  • 常量根据定义不会改变,那么为什么还要费心清除它们呢?
  • 简单:不要打电话给System.exit()(根本不推荐,正如在SO上讨论的那样)。只需在 HomeActivity 完成后清除变量即可。

标签: android android-activity process


【解决方案1】:

1) 不,Android 不保证如此。是否终止进程由操作系统决定。

2) 因为Activity 实例仍然存在于 Dalvik 虚拟机中。在 Android 中,每个进程都有一个单独的 Dalvik VM。

每个进程都有自己的虚拟机 (VM),因此应用程序的 代码独立于其他应用程序运行。

当您调用finish() 时,这并不意味着Activity 实例已被垃圾回收。您是在告诉 Android 您要关闭 Activity(不再显示)。在 Android 决定终止进程(从而终止 DVM)或实例被垃圾回收之前,它仍然存在。

当应用程序的任何组件时,Android 都会启动该进程 需要执行,然后在不再执行时关闭进程 需要或系统必须为其他应用程序恢复内存时。

3) 除非您有非常充分的理由,否则我不会这样做。根据经验,您应该让 Android 处理何时终止您的应用程序,除非您的应用程序状态中存在需要在失去焦点时重置应用程序的情况。

Quotes source

【讨论】:

  • 我还在某处看到 android 决定何时终止进程
  • @nidhi_adiga 这就是我所说的:“由操作系统决定是否终止进程。”
  • 只是为了澄清:“操作系统”我的意思是 Android ofc。
【解决方案2】:

通过调用每个活动的finish()来完成所有活动是否会关闭应用程序(其进程)?

不,不应该。这是因为活动不是应用程序的唯一组件。服务,BroadcastReceivers 仍然可以在没有 UI 的情况下运行。通过让 Application 进程尽可能保持运行,Android 可以确保更快地响应用户再次打开应用程序,或者更快地启动服务等,因为不需要重新创建 Application 实例。

只有在您或其他应用明确杀死它或系统杀死它以释放资源时,您的进程才会终止。

即使所有活动都已完成(关闭),变量的值如何保持?

您的变量位于 Application 类中,该类遵循单例模型,因此您的值将持续存在,直到整个应用进程被终止。

另外,finish() 只调用onDestroy(),它不是解构函数,正如here 解释的那样。因此,即使 Activity 变量在调用完成后可能仍然存在,因为您的实例仍然存在,直到 Android 觉得需要销毁它,或者您的进程被终止。

调用 System.exit(10) 后调用 Process.killProcess(Process.myPid()) 退出应用程序是否公平?

虽然这会杀死应用程序,但不建议这样做。请参阅this 问题,原因有很多。

【讨论】:

    【解决方案3】:

    为您的更新:

    How can I clear the application constants on exit of the application(Back press of the HomeActivity)?
    

    在 HomeActivity 中覆盖 onBackPressed 并在调用 super.onBackPressed() 之前清除所有变量。如果你的 Application 子类中有一个 String 的 setter:

    @Override
    public void onBackPressed() {
        getApplication().setMyString(null);
        super.onBackPressed();
    }
    

    如果你有很多状态需要清除,你可以编写一个方法来重置所有字段并调用它:

    @Override
    public void onBackPressed() {
        getApplication().clearAllMyFields();
        super.onBackPressed();
    }
    

    当然这些字段不必标记为finalstatic final

    【讨论】:

      【解决方案4】:

      Android 将保留该进程,直到它需要回收进程内存。这样,如果用户立即返回到您的应用程序,您的应用程序将显示得更快。

      该值将持续存在,直到应用程序被终止。

      不应该使用 System.exit(10) 后跟 Process.killProcess(Process.myPid()) 来退出应用程序?

      您真的应该考虑不退出应用程序。这不是 Android 应用程序通常的工作方式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-29
        • 2010-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多