【问题标题】:Is onStop() always preceded by onPause()onStop() 总是在 onPause() 之前
【发布时间】:2013-11-05 15:57:28
【问题描述】:

我已经读到,无论场景如何,对 onStop() 的调用总是先于对 onPause() 的调用。参考:http://developer.android.com/training/basics/activity-lifecycle/stopping.html上的图1

我们知道,当一个 Activity 没有用户的焦点但它仍然部分可见时,它会暂停,而当它完全不可见时,它就会停止。

现在在用户处于活动状态并从最近的应用程序窗口选择并进入另一个应用程序的情况下,活动将从恢复/运行状态进入停止状态。没有中间暂停状态。

不是吗?

在 onStop() 之前总是有 onPause() 的充分理由是什么?我们可以在 onStop() 中做 onPause() 中所做的事情。 为什么我们总是在 onStop() 之前需要 onPause()?

【问题讨论】:

  • 你考虑过登录这两种方法看看会发生什么吗?
  • 是的,确实如此……您遇到什么问题了吗?
  • 生命周期图将回答您的问题。
  • @SimonAndréForsberg 我是学习 android 开发的初学者,我还不知道 log 和 log cat 的东西。我正在学习如何编写我的第一个程序。
  • @gunar 是的,我已经编辑了我的问题以说出我的意思。即为什么在 onStop() 之前总是需要 onPause()?

标签: android


【解决方案1】:

onPause() 总是被调用。这是有保证的。如果您需要保存活动中的任何状态,则需要将其保存在 onPause() 中。 onStop() 可以在onPause() 之后调用,也可以不调用。视情况而定。

有很多生命周期方法。您不需要覆盖所有这些。您只需要覆盖您需要(或想要)自定义活动行为的那些。有很多生命周期方法,因为不同的应用程序有不同的要求。 Activity 的生命周期是有据可查且行为良好的。这允许程序员根据应用程序的特定要求将代码准确地放在需要的地方。

你问过

在 onStop() 之前总是有 onPause() 的充分理由是什么? 我们可以在 onStop() 中完成 onPause() 中的操作。

onPause() 总是在你的 Activity 上被调用,如果它在前台,当 Android 想要做其他事情时。它可能会启动另一个 Activity,这可能会导致您的 Activity 的 onStop() 被调用。它可能会在您的活动中调用onResume()。它可能会直接终止您的进程,而无需调用您的任何生命周期方法。

由于不能保证调用onStop(),因此您不能总是在 onStop() 中执行 onPause() 中的操作

在大多数活动中,您会发现您需要将代码放入onResume()onPause()。你通常不需要在onStop()onStart()onRestart() 中做任何事情。

【讨论】:

  • 根据这篇文章,onPause 不称为某些条件。 stackoverflow.com/questions/9226027/…
  • @Boon 有什么意义? onPause()长按HOME键显示“最近的任务”不会被调用,但Activity并没有暂停,它仍然是屏幕上最前面的Activity。如果用户从“最近的任务”列表中选择了一些东西,那么onPause() 将在你的Activity 上被调用,如果用户没有选择一些东西,那么你的Activity 仍然是屏幕上最重要的Activity .这与Activity 显示Dialog 时几乎相同。在这种情况下,Dialog 覆盖了您的Activity 的一部分,但您的Activity 没有暂停,...
  • ...onPause() 不会在您的Activity 上调用,您的Activity 仍然是屏幕上最重要的Activity。无论如何,OP 询问了onPause()onStop() 之间的区别。如果您的 Activity 已暂停,则保证会调用 onPause()。如果您的应用程序被杀死,那么onPause() 保证会在最前面的Activity 上被调用,但onStop() 可能会或可能不会被调用。
【解决方案2】:

是的,onPause() 方法将始终被执行。事实上,它是唯一保证在您的活动失去焦点/停止/销毁时调用的方法。

查看此页面:Activity

onResume()
当 Activity 开始与 再次用户。此时您的活动位于活动堆栈的顶部, 与用户输入去它。 始终后跟 onPause()。

【讨论】:

  • 从技术上讲,正如生命周期图所示。我想你的意思是onPause 总是被调用,但onStop 不是。
  • “不,onPause() 方法将始终被执行。” 是的,他们这么说。但是为什么!
  • @user2882662 onPause 总是被调用,因为这是 ActivityManager 允许应用程序清理以便它不会泄漏内存的方式。如果不能保证调用任何方法,那么每次 ActivityManager 杀死它时,您的应用程序都会泄漏内存。当您的应用程序进入后台时,将执行 onPause。 This is where you should be unregistering things like Broadcast Receivers et. al. onStop 如果您的应用程序暂停,则可能不会被调用,但 ActivityManager 会杀死它,如果您的应用程序有句柄打开,则会泄漏内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 2014-02-03
  • 2017-03-17
  • 1970-01-01
相关资源
最近更新 更多