来自Android doc http://developer.android.com/reference/android/app/Activity.html,
它说“活动进入前景”会调用onPause()
,而“活动不再可见”会调用onStop()
。
不是'活动进入前景'与“活动不再可见”相同吗? 你能告诉我他们之间有什么区别吗?
答案 0 :(得分:96)
不,如果某些活动进入前景,那并不一定意味着其他活动完全不可见。考虑以下情况:
在这里,我们同时看到两个活动。带有字段的第一个活动被另一个活动遮挡,用户无法再与之交互。但是,它仍然可见所有后果。
这留下了一个问题,哪个活动被认为是完全不透明的并覆盖整个屏幕,哪个不是。此决定基于包含活动的窗口。如果窗口具有标记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);
答案 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
。
以前的活动完全由新活动涵盖:onPause
和onStop
都会被调用
----很好地陈述一些注意事项:
注意1:如果在活动之上开始对话,则会调用onPause
或onStop
。
注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;
}
}
}
我希望这显然是