从这里的 android 文档http://developer.android.com/reference/android/app/Activity.html,它说“活动进入前台”将调用onPause()
,“活动不再可见”将调用onStop()
。
“活动进入前台”与“活动不再可见”不一样吗?你能告诉我它们之间有什么区别吗?
从这里的 android 文档http://developer.android.com/reference/android/app/Activity.html,它说“活动进入前台”将调用onPause()
,“活动不再可见”将调用onStop()
。
“活动进入前台”与“活动不再可见”不一样吗?你能告诉我它们之间有什么区别吗?
不,如果某个活动进入前台,这并不一定意味着另一个活动是完全不可见的。考虑以下情况:
在这里,我们同时看到了这两个活动。带有字段的第一个活动被另一个活动遮挡,用户无法再与之交互。但是,它仍然是可见的,并会产生所有后果。
这就留下了一个问题,哪些活动被认为是完全不透明的并覆盖整个屏幕,哪些不是。该决定基于包含活动的窗口。如果窗口有一个标志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);
如果您仍然可以看到它的任何部分(Activity
进入前台或者不占据整个屏幕,或者它有点透明),onPause()
将被调用。如果你看不到它的任何部分,onStop()
将被调用。
例如,一个 dialog** 可能不会覆盖整个 previous Activity
,这将是一个onPause()
被调用的时间。
**我在这里指的不是Android Dialog,而是一个弹出的概念概念,它只会遮蔽用户屏幕的一部分。添加此注释以根据下面@GMsoF 的评论进行澄清
处于前台意味着活动具有输入焦点。例如,一个活动可以是可见的,但部分被具有焦点的对话框遮蔽。在这种情况下,onPause()
将被调用,但不会被调用onStop()
。当对话框消失时,onResume()
将调用活动的方法(但不是onStart()
)。
onPause
每当一个新的 ACTIVITY 开始时,在任何情况下都将挑衅地调用先前的活动。
其实会有两种情况:
1-先前活动的一部分是可见的或新活动是透明的:只会onPause
被调用。
2-以前的活动完全被新活动覆盖:两者都onPause
将onStop
被调用
----很好的说明一些注意事项:
注意 1:如果对话框在活动之上开始,则 NONEonPause
或onStop
将被调用。
注意 2:如果它是一个主题设置为对话框的 Activity,则其行为将与普通 Activity 一样。
注意 3:显然是一个类似于权限对话框的系统对话框,因为棉花糖会导致onPause
.
我在使用 onPause 和 onStop 方法时遇到了很多问题,因此我将清除我遇到的三个场景 -
1.当您单击最近的应用程序按钮时,没有调用生命周期方法,但使用 hasFocus 值调用 onWindowFocusChanged(boolean hasFocus)作为假通过。在 5 之前的 android 版本中,onPause 方法用于在按下最近的应用按钮时被调用。
2.如Malcolm所述,当您的活动上出现类似活动时,将调用 onPause 按钮。如果调用了占据整个屏幕的新 Activity,则在先前的 Activity 上调用 onStop。Android权限对话框还会导致您的活动调用 onPause。
3.如果屏幕在您的活动上超时,则调用 onPause。一段时间后,如果您不打开屏幕,则会调用 onStop。
完成答案的ateiob还提到了一件重要的事情
暂停的活动完全处于活动状态(它维护所有状态和成员信息并保持连接到窗口管理器)。已停止的活动还保留所有状态和成员信息,但不再附加到窗口管理器
希望能帮助到你。
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.
是的,我试着理解,我可以在下面解释:
有 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;
}
}
}
我希望这很清楚