zoukankan      html  css  js  c++  java
  • 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】

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

  • 相关阅读:
    vi/vim 如何添加和删除多行注释
    linux报错:命令未找到
    删除远程分支的方法
    k-vim常见快捷键
    [转]常见linux命令用法介绍
    python库termcolor用法
    gitignore样例解析
    [转]"git rm" 和 "rm" 的区别
    python中的slice用法
    牛客网linux试题-错误整理-20170914
  • 原文地址:https://www.cnblogs.com/liuzenglong/p/3371453.html
Copyright © 2011-2022 走看看