当应用程序的所有活动完成后会发生什么?

时间:2013-03-21 09:59:19

标签: android android-activity process

方案:

我的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())是否公平?
  4. 更新

    如何在退出应用程序时清除应用程序常量(反向按HomeActivity)?

4 个答案:

答案 0 :(得分:14)

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

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

  

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

当您致电finish()时,这并不意味着Activity实例被垃圾收集。您告诉Android您要关闭 Activity(不再显示)。它将一直存在,直到Android决定终止进程(从而终止DVM)或实例被垃圾收集。

  

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

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

Quotes source

答案 1 :(得分:6)

  

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

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

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

  

即使所有活动都已完成(已关闭),变量的值如何仍然存在?

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

此外,finish()只调用onDestroy(),这不是解构函数,如here所述。因此,调用完成后,甚至活动变量也可能会持续存在,因为您的实例仍然存在,直到Android感觉需要销毁它,或者您的进程被终止。

  

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

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

答案 2 :(得分:2)

您的更新:

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

答案 3 :(得分:0)

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

该值将一直持续到应用程序被终止。

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

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