活动生命周期让我头痛。http://developer.android.com/reference/android/app/Activity.html上的文档在描述可见性概念时非常模糊,以至于我无法确定什么时候调用
(从生命周期图表下面摘录)
VS
(在带有“可杀死”列的蓝色表格中进一步向下)
从第一个引用中,我理解的是当活动A被“隐藏”时,将调用
但第二个引用则说明,当另一个活动即将开始恢复时,将调用
文档似乎还区分了被隐藏(调用
所以我在努力弄清楚我没有理解的内容。我知道对onPause的调用是有保证的。那就是当Activity A失去焦点(设备进入睡眠模式、屏幕锁定等)时,不同的Activity B将成为前台(Activity B可能或可能没有由Activity A启动)。但是什么时候会在Activity A上调用onStop()?
这是否取决于已经堆叠在Activity A之上的活动数量?两个不同的“可见性”定义是否在起作用?
对于这堵文字墙感到抱歉,但我真的很沮丧: S
因此问题依然存在:在哪些情况下,一个Activity被视为“隐藏”,从而对其调用了onStop()?
编辑:
我在每个onX方法中都插入了Toast通知,并发现了一些附加的怪异行为:
onStop()
和onPause()
。请看以下两个文档语句的比较:(从生命周期图表下面摘录)
onStart()
和onStop()
方法可以被多次调用,因为活动对用户变得可见和隐藏。VS
(在带有“可杀死”列的蓝色表格中进一步向下)
onPause()
当系统即将恢复先前的活动时调用。从第一个引用中,我理解的是当活动A被“隐藏”时,将调用
onStop()
,“隐藏”可能指的是另一个活动B已经恢复并完全覆盖了活动A。但第二个引用则说明,当另一个活动即将开始恢复时,将调用
onPause()
。那么这不也会完全隐藏活动A吗?两种情况似乎都意味着活动A变得“隐藏”了,不是吗?根据我的可能错误的解释,onPause()
和onStop()
在相同的情况下被调用。文档似乎还区分了被隐藏(调用
onStop()
)和部分可见性(调用onPause()
)。但是何时活动仍然是部分可见的呢?他们是指字面上的部分可见吗?或者当一个活动启动了一个新活动(活动调用startActivityForResult并启动日期选择器活动)覆盖整个屏幕时,一个活动仍然可以被认为是“部分可见”的吗?肯定不会调用onStop吧?它应该随时接收到结果!所以我在努力弄清楚我没有理解的内容。我知道对onPause的调用是有保证的。那就是当Activity A失去焦点(设备进入睡眠模式、屏幕锁定等)时,不同的Activity B将成为前台(Activity B可能或可能没有由Activity A启动)。但是什么时候会在Activity A上调用onStop()?
这是否取决于已经堆叠在Activity A之上的活动数量?两个不同的“可见性”定义是否在起作用?
对于这堵文字墙感到抱歉,但我真的很沮丧: S
因此问题依然存在:在哪些情况下,一个Activity被视为“隐藏”,从而对其调用了onStop()?
编辑:
我在每个onX方法中都插入了Toast通知,并发现了一些附加的怪异行为:
- 点击Home按钮将始终调用onStop()。但启动应用程序不会调用onRestart(),而是调用onCreate()。这对我来说很奇怪,但没关系...
- 当"USB大容量存储"活动在主活动之上启动时,将调用onStop()。并且当退出usb存储活动返回到主活动时,将调用onRestart(),而不是调用onCreate()。
- 当设备进入睡眠模式并被唤醒时,活动只经历onPause()和onResume()周期。
最后一个点是预期的(尽管我无法使其适应生命周期图表)。但1和2怎么了?
在第一个问题中,我期望在再次启动活动时会调用onRestart()。为什么它会释放该活动并调用onCreate()呢?
请看第二点: 根据文档:当“另一个活动出现在活动前面”时,应调用onPaused()
。 当USB存储活动出现时,这不是发生的情况吗? 它没有调用onPause()
,而是经历了onStop()
- OnRestart()
循环!显然,该文档并不认为这是“另一个活动出现在活动前面”的情况。那么到底发生了什么?