onStop()方法总是在onPause()方法之后调用吗?

12

据我所知,无论什么情况下,调用onStop()之前都会先调用onPause()。参考资料: http://developer.android.com/training/basics/activity-lifecycle/stopping.html上的图1。

我们知道当活动失去用户的焦点但仍部分可见时,它被暂停,而当它完全不可见时,则被停止。

现在假设用户在一个活动中,并从最近的应用程序窗口选择并进入另一个应用程序,在此情况下,该活动将从已恢复/运行状态转换为已停止状态,没有任何中间的暂停状态。

是这样吗?

为什么总是在onStop()之前执行onPause()有好的理由呢?我们可以在onStop()中完成在onPause()中完成的工作。为什么我们总是需要在onStop()之前执行onPause()?


1
你考虑过登录这两种方法来查看会发生什么吗? - Simon Forsberg
是的,那是真的...你有什么问题吗? - gunar
1
生命周期图将回答你的问题。 - Roy Hinkley
@SimonAndréForsberg 我是学习安卓开发的初学者,我还不了解日志和日志记录等相关内容。我正在学习如何编写我的第一个程序。 - user2882662
@AndroidAddict 我已经从图表中提出了问题。我感到困惑的原因是我在问题中提到的情景似乎没有在恢复和停止状态之间有一个暂停状态。另外,正如我已经编辑过我的问题,为什么我们需要在 onStop()之前调用 onPause()呢? - user2882662
显示剩余2条评论
2个回答

28

onPause()总是会被调用,这是有保障的。如果你需要保存Activity中的任何状态,你需要在onPause()中保存。onStop()可能会在onPause()之后被调用,也可能不会,这取决于具体情况。

生命周期方法有很多,你不需要覆盖所有的方法,只需要覆盖那些需要(或想要)为你的Activity自定义行为的方法。有这么多生命周期方法是因为不同的应用有不同的需求。Activity的生命周期是经过充分记录和测试的,这使得程序员可以根据应用的特定需求将代码放在恰当的位置。

你问道:

为什么要在onStop()之前总是使用onPause()?我们可以在onStop()中做onPause()中所做的事情。

onPause()总是会在Android想要执行其他操作时调用你的Activity,如果当前Activity在前台。它可能会启动另一个Activity,并导致你的Activity的onStop()被调用。它可能只是调用你的Activity的onResume()。它可能直接杀死你的进程,而不调用更多的生命周期方法。

由于onStop()不能保证被调用,你不能总是只在onStop()中做onPause()中所做的事情。

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


根据这篇文章,在某些情况下不会调用onPause方法。https://dev59.com/3mDVa4cB1Zd3GeqPb0YP - Boon
5
@Boon,你觉得有什么意义呢?如果长按 HOME 键显示“最近任务”,onPause() 方法将不会被调用,但是该 Activity 并没有被暂停,仍然是屏幕上最前面的 Activity。如果用户从“最近任务”列表中选择了某个项目,则会调用您的 ActivityonPause() 方法;如果用户没有选择任何项目,则您的 Activity 仍然是屏幕上最前面的 Activity。这与您的 Activity 显示对话框时基本相同。在这种情况下,对话框遮盖了您的 Activity 的部分区域,但是您的 Activity 并未被暂停... - David Wasser
3
如果您的Activity没有执行onPause()方法,且仍然是屏幕上最前面的Activity,则无论如何,OP都询问了onPause()和onStop()之间的区别。 如果您的Activity已暂停,则保证将调用onPause()方法。如果您的应用程序被杀死,则保证在最前面的Activity上调用onPause()方法,但可能不会调用onStop()方法。 - David Wasser

3
是的,onPause() 方法总是会被执行。实际上,当你的 Activity 失去焦点/停止/销毁时,这是唯一保证被调用的方法。
请查看此页面:Activity

onResume()
在活动将再次与用户进行交互时调用。此时,您的活动位于活动堆栈的顶部,并且用户输入将进入它。始终后跟 onPause()。


1
从技术上讲,正如生命周期图所示。我认为你想说的是onPause总是被调用,但onStop不会。 - Roy Hinkley
不,onPause()方法将始终被执行。是的,他们这么说。但为什么呢! - user2882662
@user2882662 onPause总是被调用,因为这是ActivityManager允许应用程序清理以避免内存泄漏的方式。如果没有任何方法得到保证被调用,每次ActivityManager杀死它时,您的应用程序都会泄漏内存。当您的应用程序进入后台时,将执行onPause。这是您应该注销Broadcast Receivers等内容的地方。如果您的应用程序已打开句柄,则在暂停应用程序但ActivityManager将其杀死时可能不会调用onStop,您的应用程序将泄漏内存。 - Roy Hinkley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接