根据 android 开发文档,当一个 Activity 进入前台时将会调用 onPause() 方法,而当它不再可见时将会调用 onStop() 方法。
“Activity 进入前台” 和 “Activity 不再可见” 难道不是同一个意思吗?请问它们之间有什么区别呢?
“Activity 进入前台” 和 “Activity 不再可见” 难道不是同一个意思吗?请问它们之间有什么区别呢?
不,如果某个活动进入前台,这不一定意味着另一个活动完全不可见。考虑以下情况:
在这里,我们同时看到了两个活动。带有字段的第一个活动被另一个活动遮挡,用户无法再与其交互。然而,它仍然是可见的,并具有所有相应的影响。
这就留下了一个问题,哪个活动被认为是完全不透明并覆盖整个屏幕,哪个不是。这个决定基于包含活动的窗口。如果窗口具有标志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);
onPause()
和onStop()
决策的门槛是很有趣的。它是否为100%?如果前一个活动只有一个像素可见,那么它仍然是onPause()
吗? - ateiobonPause()
。只有在我按下主页按钮时才会调用onPause()
。这怎么可能? - ateiobActivity
回到前台时,要么没有占据整个屏幕,要么有点透明),将会调用onPause()
。如果你无法看到它的任何部分,将会调用onStop()
。Activity
,这就是调用onPause()
的时候。处于前台意味着该活动具有输入焦点。例如,一个活动可以是可见的,但被具有焦点的对话框部分遮挡。在这种情况下,将调用onPause()
,但不会调用onStop()
。当对话框消失时,将调用活动的onResume()
方法(但不会调用onStart()
)。
onPause()
在设备进入睡眠状态或对话框出现时被调用"_。正如这个线程所表明的那样,一个对话框并不一定意味着一个活动已经暂停了(尽管对于像作为对话框显示的活动这样的活动来说,它确实会被暂停)。 - Ted HopponStop()
会被调用。当您在活动顶部有对话框时,onPause()
会被调用。还有一个重要的事情由ateiob提到,这完善了答案
一个暂停的活动是完全存活的(它保持所有状态和成员信息,并保持连接到窗口管理器)。一个停止的活动也保留所有状态和成员信息,但不再连接到窗口管理器。onPause
被调用了。 - CoolMind是的,我尝试理解并可以以下面的方式解释:
有两个活动: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;
}
}
}
我希望这很清楚