如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码:
package com.king.review.base; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; /** * author: king.liu * data:2013-10-8 下午8:02:40 * do:TODO */ public class ActivityLife extends Activity { public static final String TAG = "ActivityLife"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(140, 80); layout.setOrientation(LinearLayout.HORIZONTAL); Button btn = new Button(this); btn.setLayoutParams(params); btn.setText("change next"); layout.addView(btn); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { Intent intent = new Intent(); intent.setClass(ActivityLife.this, AActivity.class); ActivityLife.this.startActivity(intent); } }); setContentView(layout); Log.i(TAG, "onCreate ..."); } @Override protected void onSaveInstanceState(Bundle outState) { // TODO Auto-generated method stub super.onSaveInstanceState(outState); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart ..."); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart ..."); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume ..."); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause ..."); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop ..."); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestory ..."); } }
bActiviy
package com.king.review.base; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; /** * author: king.liu * data:2013-10-16 上午7:09:22 * do:TODO */ public class AActivity extends Activity { public static final String TAG = "AActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout layout = new LinearLayout(this); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(140, 80); layout.setOrientation(LinearLayout.HORIZONTAL); TextView tv = new TextView(this); tv.setLayoutParams(params); tv.setText("二界面"); layout.addView(tv); setContentView(layout); Log.i(TAG, "onCreate ..."); } @Override protected void onStart() { super.onStart(); Log.i(TAG, "onStart ..."); } @Override protected void onRestart() { super.onRestart(); Log.i(TAG, "onRestart ..."); } @Override protected void onResume() { super.onResume(); Log.i(TAG, "onResume ..."); } @Override protected void onPause() { super.onPause(); Log.i(TAG, "onPause ..."); } @Override protected void onStop() { super.onStop(); Log.i(TAG, "onStop ..."); } @Override protected void onDestroy() { super.onDestroy(); Log.i(TAG, "onDestory ..."); } }
ok,准备工作已经完成,开始分析了:
说明:这里我说的AActivity --->ActivityLife; BActivity--->AActivity, 刚开始没有命名好,呵呵。
如上图
刚开始启动的时候,没有疑问,生命周期是这样的,onCreate---> onStart--->onResume;
如上图
好了,点击按钮进入BActivity ,我们可以看到,AActivity 生命周期进入onPause(注意这个时候没有接着进入onStop,非常容易出错) ,
然后BActivity 的应用程序开始启动:onCreate--->onStart--->onResume. 注意只有当BActivity完全启动了,AActivity生命周期才会进入onStop。
如上图:
这个时候,我按了一下返回键,进入AActivity
可以看到生命周期是 BActivity 生命周期进入onPause,
然后是AActivity生命周期开始调用onRestart,然后再调onStart(这一个估计很多人都会弄错,我也错过了。),再调onResume, 后面就是BActivity 的生命周期进入了onStop与 onDestory. ps: 后面无论如何点,生命周期都是这样的,如此循环。
其中有一点我也解释不了(返回来的时候,为什么是从onRestart 进入onStart,而不是直接从onRestart进入onResume),有大神路过请留言,谢谢.
这里有两点我要说明一下,
首先:返回时,onCreate方法没有调用 而是直接跳过,很多朋友都在心里觉得onCreate与onResume方法是一样的,其实不然,我们在onCreate里面创建一些组件,然后可以复用,刚才就是这个场景,onResume里面就不要做创建组件的操作了,这里面主要是网络数据更新的操作。所以onCreate与onResume还是有区别的,这就是Android程序设计的高明之处。
其次:刚才我们按了返回键后,看到了BActivity被系统回收了,这也是一种高明之处啊,他没有回收AActivity,而是把BActivity给回收了。细细体会一下,就能明白为什么要这样设计。确实有些高明了。呵呵。
续:
如果BActivity的界面是一个窗口,没有完全覆盖AACtivity
如上图,启动还是这样的:onCreate--->onStrat--->onResume,不用多说
如上图,进入BActivity 看看 首先是AActivity被onPause, 然后是BActivity调用的是OnCreate--->onStart--->onResume. 这里注意一下,与之前完全覆盖的生命周期是不一样的。
如上图,再按返回键,你会看到先把BActivity生命周期调到onPause, 然后再是AActivity直接调onResume. 这里注意一下,与之前完全覆盖后的生命周期是不一样的。
如上图
如果再点那个进入BActivity的时候,生命周期是这样的,先是AActivity调onPause,然后再就是BActivity被重新创建了一下,onCreate--->onStart--->onResume, v好了,下面的需要特别说明一下,把原来的BActivity覆盖了,之前的BActivity调用onStop,onDestory。
这里尤其要注意一下,完全覆盖与非完全覆盖的区别,流程非常容易出错。
梳理一下:
完全覆盖是这样的:
AActivity【onCreate--->onStart--->onResume】,点击进入BActivity【AActivity---》onPause, BActivity,onCreate--->onStart--->onResume, AActivty---->onStop】,然后再按返回键【BActivity--->onPause,AActivity--->onRestart--->onStart--->onResume, BActivtiy--->onStop--->onDestory】
非完全覆盖
AActivity【onCreate--->onStart--->onResume】,点击进入BActivity【AActivity---》onPause, BActivity ---->onCreate---->onStart--->onResume】,然后按返回键【BActivity--->onPause,AActivity--->onResume】如果再进入BActivity【AActivity--》onPause,BActivity--->onCreate--->onStart--->onResume,而之前的BActivity 的周期是----->onStop---->onDestory】
注意对比一下,两种状态的生命周期,