onPause和onStop()之间的区别

从android doc这里http://developer.android.com/reference/android/app/Activity.html ,它说'活动进入前景'将调用onPause() ,'活动不再可见'将调用onStop()

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

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

主题为Theme.Dialog的活动

在这里我们同时看到两个活动。 与字段的第一个活动被另一个活动遮蔽,用户不能再与它交互。 然而,它仍然是可见的,所有的后果。

这留下了一个问题,哪个活动被认为是完全不透明的,覆盖整个屏幕,哪个不是。 该决定基于包含活动的窗口。 如果窗口有一个标志windowIsFloating或者windowIsTranslucent ,那么认为该活动不会使底层的东西不可见,否则会导致onStop()被调用。 相关代码可以在com.android.server.am.ActivityRecordfind:

 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()将被调用。

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

**这里我没有提到一个Android对话框,而是一个popup的东西的概念性的概念,只是掩盖了用户屏幕的一部分。 本说明是根据下面的@GMsoF发表的评论添加的

在前台意味着活动有input焦点。 例如,一个活动可以被看到,但被焦点对话所部分遮盖。 在这种情况下,将调用onPause() ,而不是onStop() 。 当对话框消失时,活动的onResume()方法将被调用(但不是onStart() )。

下图显示了一个Activity的重要状态path。 正方形矩形表示您可以在“活动”在状态之间移动时执行操作的callback方法。 有色的椭圆形是活动可以进入的主要状态。 下图显示了一个Activity的重要状态路径。

每当一个新的ACTIVITY开始上一个活动的onPause就会在任何情况下被挑衅地调用。

其实这将是两种情况:

1-以前的活动的一部分是可见的或新的活动是透明的:只有onPuase将被调用。

2-之前的活动完全由新活动所覆盖: onPuaseonStop都将被调用

—-好一些说明:

注1:如果一个对话框在一个活动之上开始onPuaseonStop将被调用。

注2:如果其主题设置为对话框的活动,行为就像正常活动一样。

注3:显然是一个系统对话框,因为棉花糖会导致onPuase

Yeap,我试着去理解,我可以在下面解释一下:

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

我希望这是清楚的