Stashed Activity意味着活动对象不存在?

时间:2016-01-14 22:37:53

标签: android lifecycle

enter image description here

我正在看这个来自" Android Programming"大书呆子牧场,我对下面的句子感到困惑。它声明"当活动被隐藏时,活动对象不存在。"这让我感到困惑,因为当我打开一个应用程序并按下主页按钮时,会调用onPause()并且活动到达" Paused"状态,其活动存储在操作系统中,如图所示。它必须仍在后台运行,因为当我按下主页按钮时不会调用onDestroy()。事实上,当我打开我的任务管理器时,我可以看到按下Home按钮时活动的样子。他们究竟是什么意思"活动对象不存在?"当它在背景中明显处于暂停状态时?

2 个答案:

答案 0 :(得分:0)

他们的文档看起来有点不对劲和令人困惑。官方的Android文档并没有谈论" stashed"状态,这将是块"应用程序进程被杀死"在文档here

基本上,仅从STOPPED状态,操作系统可能随时破坏您的活动。如果它这样做,将调用onSaveInstanceState。然后,Activity变量无效。在任何时候,它都可以重新创建一个新的Activity并在其上调用onCreate然后调用onRestoreInstanceState,传入先前保存的Bundle,以重新创建活动。

答案 1 :(得分:-1)

  

这让我感到困惑,因为当我打开一个应用程序并按下主页时   按钮,onPause()被调用,活动到达" Paused"州   其活动隐藏在操作系统中,如图所示。

我不会说这是" stashed"。你的活动很活跃,只是暂停了。

  

它必须仍然在后台运行,因为onDestroy()不是   我按下主页按钮时调用。

那是对的。当你按下主页按钮时,你要对操作系统说'嘿;嘿,我要去其他地方,但我不一定要完成这项活动。"

如果您点击后退按钮,则会看到onDestroy被叫。在这里,你要对操作系统说'#34;好的,我完成了这项活动,用它做你想做的事。"

  

它们究竟是什么意思"活动对象不存在?"当它   在背景中显然处于暂停状态?

当操作系统需要在没有您的情况下销毁您的活动时进入隐藏状态"告诉"它这样做(即按回按钮)。当您的设备进行设备配置更改时会发生这种情况。一个典型的例子是轮换。如果操作系统需要释放内存,也会发生这种情况。在这种情况下,系统会调用onSaveInstanceState来捕获Bundle中您的活动状态。然后,隐藏状态是保存此Bundle和您的活动的类名。实际的Activity对象标记为垃圾回收。然后只给出Bundle对象和活动的类名,操作系统可以在用户返回时创建活动的新实例。

除非您想要保留特定信息,否则您不必必须自己实施onSaveInstanceState。视图层次结构的某些组件会自动将有关自身的信息添加到Bundle中,因为仍会调用super Activity.onSaveInstanceState。来自文档:

  

默认实现负责处理每个实例的大部分UI   通过在每个视图上调用onSaveInstanceState()来为你状态   具有id的层次结构,并通过保存当前的id   聚焦视图(所有这些都由默认实现恢复   onRestoreInstanceState(Bundle))。如果您重写此方法   您可以保存每个视图未捕获的其他信息   可能想调用默认实现,   否则准备好自己保存每个视图的所有状态。

http://developer.android.com/reference/android/app/Activity.html#onSaveInstanceState(android.os.Bundle)

您可以在此处查看来源: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/app/Activity.java#1371