【问题标题】:is onStop() always called once onPause() is called总是在调用 onPause() 时调用 onStop()
【发布时间】:2012-07-18 20:07:16
【问题描述】:

是否有可能调用 onPause(),然后立即调用 onResume()?换句话说,在调用它的 onPause() 之后,Activity 是否总是要经过 onStop()、onStart() 和 onResume()?

活动生命周期文档说这是可能的,但是触发它的用户操作是什么?任何人都可以创建一个活动 JUnit 测试来证明这一点吗?

【问题讨论】:

    标签: android


    【解决方案1】:

    如果Activity 没有被另一个Activity 完全遮挡,那么onStop 将不会被调用

    【讨论】:

      【解决方案2】:

      是的,onPause() -> onResume() -> onPause() -> onResume() 循环经常发生。

      请参阅Activity lifecycle 文档。

      如果Activity 完全被遮挡(例如被另一个Activity),它可能会被停止,但如果它只是被另一个Activity 部分遮挡(例如,设置为对话框主题),那么它当“弹出”Activity 关闭时,将简单地暂停然后恢复。

      【讨论】:

      • 在我的实验中,甚至没有为弹出对话框调用 onPause()。我只能通过单击关机按钮来观察所需的行为(调用了 onPause 但未调用 onStop),但我还没有在真实设备上测试过。
      • @dacongy :实际上你可能是正确的,比如AlertDialog 弹出窗口不会导致onPause() 被调用。想一想,我有几个“弹出窗口”,它们实际上是用对话框“主题”创建的Activity 类。它们实际上看起来像弹出窗口,但没有覆盖整个屏幕 - 结果是调用了onPause(),但因为它们没有完全掩盖底层的Activity,它只会暂停并且不会转到@987654335 @舞台。
      • 不,不会调用 onPause()。我已经将 logcat 打印放在回调方法中,当对话框弹出时,没有任何关于 onPause() 的打印。
      • 我在真机上测试过,按电源键可以达到想要的效果。
      • @dacongy :我所有的Activity 类都扩展了我创建的基础Activity,并且每个onXXXX 方法都记录了它们被调用的情况。我可以绝对确认,当我的一个以Activities 为主题的对话框部分覆盖另一个Activity 时,肯定会调用该ActivityonPause() 方法。也许这是不同 Android 版本和设备实现的变体。
      【解决方案3】:

      image here很好地讲述每一件事

      活动可以在onPause之后直接去onResume

      【讨论】:

      • 是的,这就是我问这个问题的原因。 直接从 onPause() 到 onResume() 触发状态转换的动作是什么?
      • 这里的情况只属于OS。据我所知,我们对此无能为力。
      • “属于操作系统”是什么意思?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      • 2013-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多