Activity生命周期基础

前言:
  俗称:好记性不如烂笔头。
  学习任何技术其实也是一样,谁敢保证看过一遍就会记住了,就会用了,至少我是不敢保证。所以我们需要经常回头研究,而且会发现每一次的温故都会有不一样的收获—温故而知新,可以为师矣!
  还有,他人告知你的知识点是他人把研究结果分享给你的,而不是你自己研究的。所以要去实践它,做到吸纳它。
  

  • Activity启动生命周期
  • Activity跳转生命周期
  • Activity返回生命周期
  • Activity退出生命周期
  • Activity切后台生命周期
  • Activity唤醒前台生命周期
  • Activity横竖屏生命周期
    Demo:点击获取代码

     对于Android研发来说,四大组件的Activity本应该熟练掌握,这边先做下对于Activity的启动及正常界面跳转时的生命周期笔记。
     我们来看一下这一张经典的生命周期流程图:
    这里写图片描述
    接下来,我将根据上图所列举的生命周期的调用顺序通过log信息打印来说明其生命周期。

Code:

基类:在基类实现上图生命周期并做Log信息打印

package com.sdf.aso.activitylifecycle;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

/**
 * Created by itsdf07 on 2017/3/29 10:44.
 * E-Mail: [email protected]
 * GitHub: https://github.com/itsdf07
 */

public class BaseActivity extends Activity {
    public final static String TAG = "dfsu";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onCreate :");
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onStart :");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onResume :");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onPause :");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onStop :");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onRestart :");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onDestroy :");
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onSaveInstanceState : outState = " + outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onRestoreInstanceState : savedInstanceState = " + savedInstanceState);
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        Log.d(TAG, "[" + getClass().getSimpleName() + "]" + " onConfigurationChanged : newConfig = " + newConfig);
    }
}

接下来实现用来简单的验证界面跳转时的Activity(extend BaseActivity, 只简单实现跳转):
MainActivity.java –> FirstActivity.java –> SecondActivity.java –> MainActivity.java
以上Activity循环跳转

步骤及Log信息:

  1. 从启动到逐个循环跳转
    1.1、启动:正常的启动或者Ide启动MainActivity

    03-29 13:28:48.942 1700-1700/?com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 13:28:48.974 1700-1700/? com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 13:28:48.974 1700-1700/? com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    

    1.2、从MainActivity —跳转到—> FirstAcivity

    03-29 13:30:00.100 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 13:30:00.115 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onCreate :
    03-29 13:30:00.122 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
    03-29 13:30:00.122 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
    03-29 13:30:00.558 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    

    1.3、从FirstActivity —跳转到—> SecondActivity

    03-29 13:30:32.492 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onPause :
    03-29 13:30:32.508 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onCreate :
    03-29 13:30:32.519 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStart :
    03-29 13:30:32.519 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onResume :
    03-29 13:30:32.969 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStop :
    

    1.4、从SecondActivity —跳转到—> MainActivity

    03-29 13:31:54.744 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onPause :
    03-29 13:31:54.762 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 13:31:54.773 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 13:31:54.773 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    03-29 13:31:55.217 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStop :
  2. 在第1步的基础上逐个返回到MainActivity在点击返回退出程序

    2.1、从MainActivity —返回到—> SecondActivity

    03-29 13:36:44.967 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 13:36:44.972 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onRestart :
    03-29 13:36:44.973 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStart :
    03-29 13:36:44.973 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onResume :
    03-29 13:36:45.295 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 13:36:45.295 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    

    2.2、从SecondActivity —返回到—> FirstActivity

    03-29 13:37:49.299 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onPause :
    03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onRestart :
    03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
    03-29 13:37:49.302 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
    03-29 13:37:49.628 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onStop :
    03-29 13:37:49.628 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onDestroy :
    

    2.3、FirstActivity —返回到—> MainActivity

    03-29 13:38:27.465 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onPause :
    03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestart :
    03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 13:38:27.472 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    03-29 13:38:27.805 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStop :
    03-29 13:38:27.805 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onDestroy :
    

    2.4、从MainActivity点返回退出程序

    03-29 13:38:41.731 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 13:38:42.106 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 13:38:42.106 1700-1700/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    
  3. 前后台切换(在MainActivity界面验证)

    3.1、切后台

    03-29 14:08:47.984 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 14:08:48.384 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    

    3.2、唤醒到前台

    03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestart :
    03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 14:09:26.028 23281-23281/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    

    3.3、直接结束进程则不会有其他生命周期的函数调用

  4. 横竖屏切换(在MainActivity界面验证)
    在BaseActivity中增加横竖屏时的生命函数:
    onSaveInstanceState :Activity 即将销毁时保存数据
    onRestoreInstanceState :Activity 重建或者恢复时候取出数据
    当加上以上函数时,在执行第1点Activity跳转的时候,比如MainActivity –> FirstActivity,将会在onStop前调用一次数据存储onSaveInstanceState ,log信息如下:

    03-29 15:04:51.862 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 15:04:51.872 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onCreate :
    03-29 15:04:51.886 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onStart :
    03-29 15:04:51.886 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [FirstActivity] onResume :
    --> 03-29 15:04:52.334 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@34cea9e0}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@3700c499, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@e90835e}}]}]
    03-29 15:04:52.334 8107-8107/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    
    

    4.1、在Activity默认没有设置android:configChanges或者设置为:android:configChanges=”orientation|keyboardHidden”时,生命周期为一致,都执行了销毁流程并重新实例Activity,用例:MainActivity(默认没设置)、FirstActivity(设置:android:configChanges=”orientation|keyboardHidden”)
    执行横屏如下:

    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@e6a74a1}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@2862e6c6, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@1790c687}}]}]
    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 14:25:01.756 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    03-29 14:25:01.808 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 14:25:01.823 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 14:25:01.825 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestoreInstanceState : savedInstanceState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@e6a74a1}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@2862e6c6, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@1790c687}}]}]
    03-29 14:25:01.825 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    
    

    恢复竖屏

    03-29 14:25:36.571 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onPause :
    03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onSaveInstanceState : outState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@195210aa}}]}]
    03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStop :
    03-29 14:25:36.572 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onDestroy :
    03-29 14:25:36.608 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onCreate :
    03-29 14:25:36.620 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onStart :
    03-29 14:25:36.622 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onRestoreInstanceState : savedInstanceState = Bundle[{android:viewHierarchyState=Bundle[{android:views={16908290=android.view.AbsSavedState$1@93d94db, 2131230720=android.view.AbsSavedState$1@93d94db, 2131230721=android.view.AbsSavedState$1@93d94db}, android:ActionBar={16908332=android.view.AbsSavedState$1@93d94db, 16908347=android.view.AbsSavedState$1@93d94db, 16908980=android.view.AbsSavedState$1@93d94db, 16908981=android.view.AbsSavedState$1@93d94db, 16909173=com.android.internal.widget.ActionBarView$SavedState@262cab4c}, android:Panels={0=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@25fe4795, 8=com.android.internal.policy.impl.PhoneWindow$PanelFeatureState$SavedState@195210aa}}]}]
    03-29 14:25:36.622 17923-17923/com.sdf.aso.activitylifecycle D/dfsu: [MainActivity] onResume :
    
    

    4.2、在Activity默认没有设置android:configChanges或者设置为:android:configChanges=”orientation|screenSize”时,Activity的生命周期与4.1中不一样,不会重新执行相应的生命周期,而是执行了onConfigurationChanged 函数,用例:SecondActivity
    执行横屏如下:

    03-29 15:43:27.398 22643-22643/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onConfigurationChanged : newConfig = {1.0 460mcc2mnc zh_CN ldltr sw360dp w598dp h335dp 480dpi nrml land finger -keyb/v/h -nav/h s.62}
    
    

    恢复竖屏

    03-29 15:43:29.753 22643-22643/com.sdf.aso.activitylifecycle D/dfsu: [SecondActivity] onConfigurationChanged : newConfig = {1.0 460mcc2mnc zh_CN ldltr sw360dp w360dp h567dp 480dpi nrml port finger -keyb/v/h -nav/h s.63}
    
    
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章