• Android 中Activity生命周期分析:Android中横竖屏切换时的生命周期过程


    最近在面试Android,今天出了一个这样的题目,即如题:

    我当时以为生命周期是这样的:

    onCreate --》 onStart -- ---》 onResume ---》 onPause ---》 onStop ---》 onRestart ---》 onResume ---》 onPause ---》 onStop

    回家后我自己在电脑上重新演示了一下,得出了另外的结果,果然是实践出真知啊。 好了,先上代码,给有需要的朋友直接贴代码:

    package com.king.review.base;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    
    /**
     * 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);
            
            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 ...");
        }
    
    }

    既然谈到了Activity问题,那我就完整的来弄一下。

    首先程序启动的时候,打印出的log:

    10-08 20:32:52.231: I/ActivityLife(1188): onCreate ...
    10-08 20:32:52.251: I/ActivityLife(1188): onStart ...
    10-08 20:32:52.251: I/ActivityLife(1188): onResume ...

    即流程是onCreate --->onStart--->onResume.

    点返回按钮的时候,打印的log:

    10-08 20:33:49.282: I/ActivityLife(1188): onPause ...
    10-08 20:33:50.401: I/ActivityLife(1188): onStop ...
    10-08 20:33:50.401: I/ActivityLife(1188): onDestory ...

    流程是:onPause--->onStop--->onDestory

    综上一个正常的流程就是 :onCreate --->onStart--->onResume--》onPause--->onStop--->onDestory

    再来说说横竖屏切换时的生命周期:

    首先启动时:

    10-08 20:46:43.811: I/ActivityLife(1188): onCreate ...
    10-08 20:46:43.831: I/ActivityLife(1188): onStart ...
    10-08 20:46:43.831: I/ActivityLife(1188): onResume ...

    生命周期是这样的:onCreate--->onStart--->onResume.

    然后切换一下:

    10-08 20:47:56.551: I/ActivityLife(1188): onPause ...
    10-08 20:47:56.561: I/ActivityLife(1188): onStop ...
    10-08 20:47:56.561: I/ActivityLife(1188): onDestory ...
    10-08 20:47:56.631: I/ActivityLife(1188): onCreate ...
    10-08 20:47:56.631: I/ActivityLife(1188): onStart ...
    10-08 20:47:56.651: I/ActivityLife(1188): onResume ...

    生命周期是这样的:onPause-->onStop--->onDestory--->onCreate--->onStart--->onResume;

    然后再切换一下屏幕:

    10-08 20:49:24.601: I/ActivityLife(1188): onPause ...
    10-08 20:49:24.601: I/ActivityLife(1188): onStop ...
    10-08 20:49:24.601: I/ActivityLife(1188): onDestory ...
    10-08 20:49:24.621: I/ActivityLife(1188): onCreate ...
    10-08 20:49:24.631: I/ActivityLife(1188): onStart ...
    10-08 20:49:24.631: I/ActivityLife(1188): onResume ...

    生命周期是这样:onPause--->onStop---》onDestory---》onCreate--->onStart--->onResume;

    综上:Android中横竖屏切换时的生命周期是这样的:

    onCreate--->onStart--->onResume.--》onPause--->onStop---》onDestory--->onCreate--->onCreate--->onStart--->onResume;

    onCreate --》 onStart -- ---》 onResume ---》 onPause ---》 onStop ---》 onRestart ---》 onResume ---》 onPause ---》 onStop

    在这里特别要注意一下,当屏幕切换的时候,之前那个屏幕状态就已经销毁了(onDestory),然后在新的屏幕中重新开始一个生命周期:(onCreate-->onStart--->onResume)

    我犯的错误是,以为之前屏幕生命周期被挂载起来了,然后再重新启动(onRestart)。。。 这种问题比较常见,正好和小伙伴能共享一下。

  • 相关阅读:
    类型化dataset分页
    cp自动创建层级结构的例子
    You have tried to change the API from what has been previously approved.
    Mysql学习笔记
    cygwin设置NDK环境变量ANDROID_NDK_ROOT
    PowerDesigner学习笔记
    Spring Cloud Commons教程(三)忽略网络接口
    Spring Cloud Commons教程(二)Spring RestTemplate作为负载平衡器客户端
    Spring Cloud Commons教程(一)普通抽象
    Spring Cloud教程(十二)加密和解密
  • 原文地址:https://www.cnblogs.com/liuzenglong/p/3357818.html
Copyright © 2020-2023  润新知