163

从这里的 android 文档http://developer.android.com/reference/android/app/Activity.html,它说“活动进入前台”将调用onPause(),“活动不再可见”将调用onStop()

“活动进入前台”与“活动不再可见”不一样吗?你能告诉我它们之间有什么区别吗?

4

8 回答 8

114

不,如果某个活动进入前台,这并不一定意味着另一个活动是完全不可见的。考虑以下情况:

以 Theme.Dialog 为主题的活动

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

这就留下了一个问题,哪些活动被认为是完全不透明的并覆盖整个屏幕,哪些不是。该决定基于包含活动的窗口。如果窗口有一个标志windowIsFloatingwindowIsTranslucent,则认为该活动不会使底层内容不可见,否则它将导致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);
于 2012-02-13T19:15:34.253 回答
44

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

例如,一个 dialog** 可能不会覆盖整个 previous Activity,这将是一个onPause()被调用的时间。

**我在这里指的不是Android Dialog,而是一个弹出的概念概念,它只会遮蔽用户屏幕的一部分。添加此注释以根据下面@GMsoF 的评论进行澄清

于 2012-02-13T19:11:15.380 回答
17
于 2018-06-18T10:33:40.233 回答
11

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

于 2012-02-13T19:13:28.840 回答
2

onPause每当一个新的 ACTIVITY 开始时,在任何情况下都将挑衅地调用先前的活动。

其实会有两种情况:

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

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

----很好的说明一些注意事项:

注意 1:如果对话框在活动之上开始,则 NONEonPauseonStop将被调用。

注意 2:如果它是一个主题设置为对话框的 Activity,则其行为将与普通 Activity 一样。

注意 3:显然是一个类似于权限对话框的系统对话框,因为棉花糖会导致onPause.

于 2017-11-01T09:26:08.687 回答
0

我在使用 onPause 和 onStop 方法时遇到了很多问题,因此我将清除我遇到的三个场景 -
1.当您单击最近的应用程序按钮时,没有调用生命周期方法,但使用 hasFocus 值调用 onWindowFocusChanged(boolean hasFocus)作为假通过。在 5 之前的 android 版本中,onPause 方法用于在按下最近的应用按钮时被调用。

2.如Malcolm所述,当您的活动上出现类似活动时,将调用 onPause 按钮​​。如果调用了占据整个屏幕的新 Activity,则在先前的 Activity 上调用 onStop。Android权限对话框还会导致您的活动调用 onPause。

3.如果屏幕在您的活动上超时,则调用 onPause。一段时间后,如果您不打开屏幕,则会调用 onStop。

完成答案的ateiob还提到了一件重要的事情

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


希望能帮助到你。

于 2018-10-27T19:11:17.383 回答
0

In concise words:

onStop() of previous activity life-cycle method is invoked when another activity is shown. When you have Dialogue on the top of activity, there onPause() is invoked.

Note: Activities are those components which fill your entire screen.

Note: Dialogues are not Activity as they don't completely fill the screen.

于 2018-07-03T02:44:47.367 回答
-5

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

有 2 个活动:ActivityA 和 ActivityB

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;
    }
}
}

我希望这很清楚

于 2014-10-27T04:18:27.513 回答