Android Activites 的 onPace ()和 onStop ()有什么区别?

这里是机器人博士 http://developer.android.com/reference/android/app/Activity.html, 该公司表示,“活动进入前台”将调用 onPause(),“活动不再可见”将调用 onStop()

“活动进入前景”和“活动不再可见”不是一样的吗? 你能告诉我他们之间有什么不同吗?

58664 次浏览

如果您仍然可以看到它的任何部分(前台的 Activity要么不占据整个屏幕,要么有点透明) ,onPause()将被调用。如果您看不到它的任何部分,onStop()将被调用。

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

我在这里并不是指 Android 对话框,而是一个概念性的想法,它会弹出来,只是模糊了用户屏幕的一部分。本说明是根据以下@GMsoF 的评论加以澄清的

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

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

Activity with the theme 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);

是的,我试着去理解,我可以在下面解释:

有两个活动: 活动 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将在任何情况下被挑衅性地调用。

实际上会有两种情况:

1-先前活动的一部分是可见的,或者新活动是透明的: 只调用 onPause

2-以前的活动完全被新的活动覆盖: onPauseonStop都将被调用

——很高兴陈述一些注意事项:

注意1: 如果一个对话框在一个活动的顶部开始,则不会调用 onPauseonStop中的任何一个。

注意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也提到了一件重要的事情来完成这个问题的答案

暂停的活动是完全活动的(它维护所有状态和 成员信息,并保持附加到窗口管理器) 停止的活动也保留所有的状态和成员信息,但是 不再依附于窗口管理器


希望能有帮助。