16

设想:

我的 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 的后按)?

4

4 回答 4

14

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

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

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

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

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

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

行情来源

于 2013-03-21T10:05:38.047 回答
6

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

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

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

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

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

此外,finish()仅调用onDestroy()不是解构器,如此所述。因此,即使 Activity 变量在调用完成后可能仍然存在,因为您的实例仍然存在,直到 Android 觉得需要销毁它,或者您的进程被杀死。

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

虽然这会杀死应用程序,但不建议这样做。出于多种原因,请参阅此问题。

于 2013-03-21T10:07:50.513 回答
2

对于您的更新:

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

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

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

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

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

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

于 2013-06-02T08:21:01.793 回答
0

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

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

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

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

于 2013-03-21T10:09:21.947 回答