onPause和onStop()之间的区别

时间:2012-02-13 19:09:28

标签: android android-activity android-lifecycle

来自Android doc http://developer.android.com/reference/android/app/Activity.html, 它说“活动进入前景”会调用onPause(),而“活动不再可见”会调用onStop()

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

8 个答案:

答案 0 :(得分:96)

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

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

答案 1 :(得分:32)

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

例如,对话框**可能无法覆盖整个之前的Activity,这将是onPause()被调用的时间。

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

答案 2 :(得分:10)

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

答案 3 :(得分:2)

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

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

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

总结 -

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

onPause()+ onStop() - 其他新活动完全覆盖了屏幕。活动将移至Back Stack。

了解更多关于 - Back Stack

答案 4 :(得分:0)

每当新的ACTIVITY启动时,前一个活动的onPause将在任何情况下被默认调用。

实际上会有两种情况:

1-上一个活动的一部分可见或新活动是透明的:仅调用onPause

以前的活动完全由新活动涵盖:onPauseonStop都会被调用

----很好地陈述一些注意事项:

注意1:如果在活动之上开始对话,则会调用onPauseonStop

注2:如果它的主题设置为对话框的活动,则行为将像普通活动一样。

注3:显然是一个系统对话框,如权限对话框,因为marshmallow会导致onPause

答案 5 :(得分:0)

简而言之:

显示另一个活动时,将调用先前活动生命周期方法的

onStop()。当您将对话放在活动顶部时,将调用onPause()

注意:活动是构成整个屏幕的那些组件。

注意:由于对话没有完全填满屏幕,因此它们不是活动。

答案 6 :(得分:0)

我在使用onPause和onStop方法时遇到了许多问题,因此我将清除遇到的三种情况-
1。。当您单击“最近使用的应用程序”按钮时,不会调用任何生命周期方法,但是会调用onWindowFocusChanged(boolean hasFocus),并将hasFocus值传递为false。在5之前的android版本中,按下最近的应用程序按钮时会调用onPause方法。

2。。当活动上方出现类似活动的弹出窗口时,如Malcolm所述,将调用onPause按钮。如果调用占据整个屏幕的新活动,则在先前活动上调用onStop。 Android permission dialog还会导致您的活动调用onPause。

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

ateiob中提到的另一项重要的问题是完成答案

  

已暂停的活动是完全活着的(它保持所有状态,并且   成员信息,并保留在窗口管理器中)。一种   停止的活动还保留所有状态和成员信息,但是   不再附加到窗口管理器


希望对您有所帮助。

答案 7 :(得分:-5)

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

有两项活动: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;
    }
}
}

我希望这显然是