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

场景:

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

问题:

  1. 通过调用每个活动的finish()完成所有活动将关闭应用程序(其过程)?
  2. 即使所有活动都已完成(关闭),variables的值如何仍然存在?
  3. 调用System.exit(10)后跟Process.killProcess(Process.myPid())退出应用程序是否公平?

更新:

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

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

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

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

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

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

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

行情来源

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

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

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

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

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

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

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

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

为您的更新:

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

在HomeActivity中覆盖onBackPressed,并在调用super.onBackPressed()之前清除所有variables。 如果您有一个位于Application子类内的String的setter:

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

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

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

当然,这些领域不应被标记为finalstatic final

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

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

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

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