Android 中Activity生命周期分析(二):从AActivity 到BActivity过程分析

如果你没有动手去演示的话,你一定要去动手试试看,这个东西非学容易出错,面试中经常出现,好了,上代码:

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】

注意对比一下,两种状态的生命周期,

原文地址:https://www.cnblogs.com/liuzenglong/p/3371453.html