这里是机器人博士 http://developer.android.com/reference/android/app/Activity.html, 该公司表示,“活动进入前台”将调用 onPause(),“活动不再可见”将调用 onStop()。
onPause()
onStop()
“活动进入前景”和“活动不再可见”不是一样的吗? 你能告诉我他们之间有什么不同吗?
如果您仍然可以看到它的任何部分(前台的 Activity要么不占据整个屏幕,要么有点透明) ,onPause()将被调用。如果您看不到它的任何部分,onStop()将被调用。
Activity
例如,一个对话框 * * 可能不会覆盖以前的整个 Activity,而这将是调用 onPause()的时间。
我在这里并不是指 Android 对话框,而是一个概念性的想法,它会弹出来,只是模糊了用户屏幕的一部分。本说明是根据以下@GMsoF 的评论加以澄清的
处于前台意味着该活动具有输入焦点。例如,一个活动可以是可见的,但是部分地被有焦点的对话框所遮蔽。在这种情况下,将调用 onPause(),但不调用 onStop()。当对话框消失时,将调用活动的 onResume()方法(但不调用 onStart())。
onResume()
onStart()
不,如果某些活动进入前景,并不一定意味着其他活动是完全不可见的。考虑以下情况:
这里我们同时看到了这两个活动。带有字段的第一个活动被另一个活动模糊,用户不能再与它交互。然而,它仍然可见的所有结果的后果。
这就留下了一个问题: 哪些活动被认为是完全不透明的,并且覆盖了整个屏幕,哪些不是。该决策基于包含该活动的窗口。如果窗口有一个标志 windowIsFloating或者 windowIsTranslucent,那么就认为活动不会使底层的内容不可见,否则它会导致调用 onStop()。有关代码可在 com.android.server.am.ActivityRecord中找到:
windowIsFloating
windowIsTranslucent
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);
是的,我试着去理解,我可以在下面解释:
有两个活动: 活动 A 和活动 B
public class ActivityA extends Activity implements OnClickListener { // button private Button mBtnChangeActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); initialize(); setEvent(); } private void initialize() { Log.i("Activity A", "Initialize()"); mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity); } private void setEvent() { Log.i("Activity A", "setEvent()"); mBtnChangeActivity.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.i("Activity A", "onStart"); } @Override protected void onResume() { super.onResume(); Log.i("Activity A", "onResume"); } @Override protected void onPause() { super.onPause(); Log.i("Activity A", "onPause"); } @Override protected void onStop() { super.onStop(); Log.i("Activity A", "onStop"); } @Override protected void onDestroy() { super.onDestroy(); Log.i("Activity A", "onDestroy"); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_change_activity: Intent activityB = new Intent(this, ActivityB.class); startActivity(activityB); break; default: break; } }
这里是活动 B。跟随我在代码中的注释
public class ActivityB extends Activity implements OnClickListener { // button private Button mBtnChangeActivity; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_a); initialize(); setEvent(); // if call finish() here, activityA will don't stop, just pause // Activity A will call onStop() when Activity B call onStart() method finish(); } private void initialize() { Log.i("Activity B", "Initialize()"); mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity); } private void setEvent() { Log.i("Activity B", "setEvent()"); mBtnChangeActivity.setOnClickListener(this); } @Override protected void onStart() { super.onStart(); Log.i("Activity B", "onStart"); } @Override protected void onResume() { super.onResume(); Log.i("Activity B", "onResume"); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_change_activity: finish(); break; default: break; } } }
我希望这很清楚
无论何时一个新的活动开始前一个活动的 onPause将在任何情况下被挑衅性地调用。
onPause
实际上会有两种情况:
1-先前活动的一部分是可见的,或者新活动是透明的: 只调用 onPause。
2-以前的活动完全被新的活动覆盖: onPause和 onStop都将被调用
onStop
——很高兴陈述一些注意事项:
注意1: 如果一个对话框在一个活动的顶部开始,则不会调用 onPause或 onStop中的任何一个。
注意2: 如果它的一个活动的主题被设置为一个对话框,行为将会像一个正常的活动。
注意3: 显然是一个类似权限对话框的系统对话框,因为棉花糖会导致 onPause。
实际上,应该考虑 “ onPuse ()”之间的区别和 < strong > “ onPuse () + onStop ()”。
无论何时发生新的活动并占用 Screen 的部分空间。因此,您以前运行的活动在某种程度上仍然是可见的。在这种情况下,不会将以前运行的活动推送到 BackStack。因此,这里只调用 onPuse ()方法.
另一方面,如果某个新活动发生并占据整个屏幕,那么以前运行的活动将消失。在这种情况下,先前运行的活动将移到 BackStack。在这里,onPace () + onStop ()被调用。
致摘要 -
OnPuse () -Screen 被其他新活动部分覆盖。活动不会移动到 Back Stack。
OnPuse () + onStop () -Screen 被其他新活动完全覆盖。活动被移动到 Back Stack。
认识-后面的堆栈。
简而言之:
当显示另一个活动时,将调用先前活动生命周期方法的 onStop()。当您在活动顶部有 Dialogue 时,就会调用 onPause()。
注意 : 活动是那些填满整个屏幕的组件。
注意 : 对话不是活动,因为它们没有完全填满屏幕。
我在使用 onPace 和 onStop 方法时遇到了很多问题,因此我将清除我遇到的三个场景- 1.当你点击最近的应用程序按钮时,没有调用生命周期方法,但是调用 onWindowFocusChanged (boolean hasFocus) ,hasFocus 值传递为 false。在5之前的 android 版本中,当按下最近的应用程序按钮时,会调用 onPace 方法。< br > 2.如 马尔科姆所述,当活动上方出现类似活动的弹出窗口时,就会调用 onPace 按钮。如果调用了占据整个屏幕的新活动,那么对前一个活动调用 onStop。Android 权限对话框也会导致您的活动调用 onPuse。< br > 3. 如果屏幕超时,则调用 onPause。过了一段时间,如果你不打开屏幕,然后 onStop 将被调用。
Ateiob也提到了一件重要的事情来完成这个问题的答案
暂停的活动是完全活动的(它维护所有状态和 成员信息,并保持附加到窗口管理器) 停止的活动也保留所有的状态和成员信息,但是 不再依附于窗口管理器
希望能有帮助。