onPause和onStop()之间的区别

mic*_*ael 139 android android-lifecycle android-activity

从android doc这里http://developer.android.com/reference/android/app/Activity.html,它说"活动进入前台"将调用onPause(),并且"活动不再可见"将调用onStop().

不是"活动进入前景"与"活动不再可见"相同吗?你能告诉我他们之间有什么区别吗?

Mal*_*olm 102

不,如果某些活动进入前景,那并不一定意味着其他活动完全不可见.考虑以下情况:

主题为Theme.Dialog的活动

在这里,我们同时看到两个活动.带有字段的第一个活动被另一个活动遮挡,用户无法再与之交互.然而,它仍然可见所有后果.

这留下了一个问题,哪个活动被认为是完全不透明的,覆盖整个屏幕,哪个不是.此决定基于包含活动的窗口.如果窗口有一个标志windowIsFloating或者windowIsTranslucent,则认为该活动不会使底层的东西不可见,否则它会导致onStop()被调用.相关代码可在以下位置找到com.android.server.am.ActivityRecord:

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);
Run Code Online (Sandbox Code Playgroud)

  • +1是一个很好的解释,侧重于部分与总(可见)的可见性.知道屏幕的阈值百分比将会很有趣,这使得Android决定在`onPause()`和`onStop()`之间.是100%吗?如果前一个活动中只有一个像素可见,它仍然是"onPause()"吗? (9认同)
  • @ateiob在任何地方都没有说,但我想是的.但是,这通常是显而易见的,因为大多数不填满整个屏幕的活动只是使用系统提供的一种风格来进行对话. (3认同)
  • @GMsoF一项活动.这是重点:并非每个对话框实际上都是对话框.您可以将活动看作对话框,因此它实际上比整个屏幕小. (3认同)

nic*_*ild 34

如果您仍然可以看到它的任何部分(Activity前景不会占据整个屏幕,或者它有点透明),onPause()将被调用.如果你看不到它的任何部分,onStop()就会被调用.

例如,对话框**可能不会覆盖整个前一个对话框,Activity这将是一个onPause()被调用的时间.

**我不是指这里的Android对话,而是一个弹出的东西的概念性想法,只是模糊了部分用户屏幕.根据以下@GMsoF的评论添加了此注释以进行澄清

  • 没有.这是误导.显示的对话框不会调用onPause(),因为对话框使用当前活动的上下文,认为活动是活动的. (32认同)
  • @GMsoF听起来就像我说对话框一样,你认为我的意思是'Dialog`,就像Android类一样.然而,我所得到的是部分模糊了第一个"活动"的东西,以说明所有新的"活动"都不需要完全覆盖之前的"活动". (5认同)

Yas*_*ash 14

实际上,应该考虑“onPause()”“onPause() + onStop()”之间区别

每当一些新活动发生并占据屏幕的某些部分空间时。因此,您之前运行的活动在某种程度上仍然可见。在这种情况下,之前运行的活动不会被推送到 Back Stack。所以,这里只调用了 onPause() 方法

另一方面,如果一些新的 Activity 出现并占据全屏,那么你之前运行的 Activity 就会消失。在这种情况下,您之前运行的活动将移至 Back Stack。在这里, onPause() + onStop() 被调用。

总结——

onPause() - 屏幕被其他新活动部分覆盖。Activity 不会移动到 Back Stack。

onPause() + onStop() - 屏幕被其他新活动完全覆盖。Activity 被移到 Back Stack。

了解更多 -返回堆栈


Ted*_*opp 10

处于前台意味着活动具有输入焦点.例如,活动可以是可见的,但是被具有焦点的对话框部分遮盖.在那种情况下,onPause()将被调用,但不会onStop().当对话框消失时,onResume()将调用activity的方法(但不会onStart()).

  • 对话可能会产生误导.让我们从此活动的主UI线程中弹出一个警告对话框,在这种情况下不会调用onPause().仅当此对话框从其他活动或其他应用程序弹出时. (5认同)