是否保证调用 Activity.onStop() (API 11 +)

Posted

技术标签:

【中文标题】是否保证调用 Activity.onStop() (API 11 +)【英文标题】:Is Activity.onStop() guaranteed to be called (API 11 +) 【发布时间】:2015-06-06 08:36:10 【问题描述】:

从文档中不清楚(至少对我来说)是否保证调用 Activity.onStop。有两个地方的信息看似矛盾。

    Activity.onStop 的 Javadoc:

请注意,在调用 onPause() 方法后系统没有足够内存来保持 Activity 进程运行的低内存情况下,可能永远不会调用此方法。

    Activity 类http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle 的文档(尤其是“Killable”列):

从 Honeycomb 开始,应用程序在其 onStop() 返回之前不会处于可终止状态。这会影响何时可以调用 onSaveInstanceState(Bundle)(它可以在 onPause() 之后安全调用,并允许应用程序安全地等待 onStop() 以保存持久状态。

要找到一种让两份文档都说真话的方法有点困难。我能想到的唯一场景是:假设您正在目标 API 21(最小 sdk 10)上开发并使用 onStop() 方法编写一个 Activity。如果您随后在 API 10 手机上运行此应用程序,则不能保证调用 onStop()。这种情况意味着上面第 1 点和第 2 点的文档都是正确的。否则,其中之一一定是假的。

【问题讨论】:

【参考方案1】:

Activity.onStop() 是否保证被调用(API 11 +)

是的,保证在后Honeycomb设备(API 11 +)上调用它

来源1:Video tutorial on Activity life cycle - taught by Google developer advocate

来源2:https://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle

来源 3:AndroidLifeCycle article on www.vogella.com

【讨论】:

但是,你知道为什么 Android 文档会显示其他 - 文档显示 onStop() 对所有版本都是可杀的,并显示 onPause() 在 pre-honeycomb 中是可杀的 - i.imgur.com /CYpQdSL.png (developer.android.com/reference/android/app/Activity.html) 在您提供的同一链接中,在表格下方,文档显示从 Honeycomb 开始,应用程序在其 onStop() 返回之前不会处于可终止状态。跨度> 是不是表示表格里面的信息不准确? 可能是他们没有更新表格或忽略了它。要添加更多证明我的答案正确的证据,您可以观看视频(答案中的 Source1)。它是由 Reto Meier(在谷歌工作)教授的。链接到他的个人资料:- twitter.com/retomeier,medium.com/@retomeier,linkedin.com/in/retomeier【参考方案2】:

如果你再往下看ActivityLifeCycle reference,它会说:

对于那些没有被标记为可杀死的方法,activity的进程不会被系统杀死,从方法被调用开始,返回后继续。因此,activity 处于可终止状态,例如,在 onPause() 之后到 onResume() 开始之间

由于这似乎强化了第 1 点,我会在保守方面犯错,并设计和计划我的代码,就好像第 1 点是正确的,而忽略第 2 点。

【讨论】:

以上是关于是否保证调用 Activity.onStop() (API 11 +)的主要内容,如果未能解决你的问题,请参考以下文章

BeginRead 是不是保证读取在调用它之后到达的任何传入字节?

如果我在排序映射上调用键,结果seq是否保证按排序顺序排列?

发送消息保证后,是否与TCP套接字断开连接?

try-with-resources:Java 是不是对 .close() 的调用顺序做出任何保证?

Web 服务和事务保证

是否按位或保证评估顺序?