Android Activity的生命周期和启动模式(一)——典型情况下的生命周期分析

Android开发艺术探索学习第一章《Activity的生命周期和启动模式》

典型情况下的生命周期分析

正常情况下,Activity会经历如下生命周期

onCreate --> onStart--> onResume --> onPause --> onStop -->onDestory

  1. onCreate(): Activity正在被创建,生命周期的第一个方法,可以做一些初始化工作,如调用setContentView加载界面布局、初始化Activity所需数据等;
  2. onStart(): Activity正在被启动,即将开始。这时Activity已经可见,但还未显示在前台,无法与用户交互。
  3. onResume(): Activity已经可见,并出现在前台并开始活动。
  4. onPause(): Activity正在停止,正常情况下,onStop就会被调用。此方法中可以做一些存储数据、停止动画等工作,注意不能太耗时,因为这会影响新Activity的显示,onPause必须先执行完,新Activity的onResume才会执行。
  5. onStop(): Activity即将停止,可以做一些稍微轻量级的回收工作,同样不能太耗时。
  6. onDestroy(): Activity即将被销毁,Activity生命周期的最后一个回调,在这个方法里我们可以做一些回收工作和最终的资源释放。
学习过Android的同学都知道onRestart方法,当Activity重新启动时,从不可见变为可见状态时,onRestart就会被调用。如用户点击Home键、或者打开一个新的Activity时,这时当前的Activity就会暂停,当前Activity会执行onPause、onStop方法,接着用户又重新回到当前Activity就会执行onRestart方法。
Android Activity的生命周期和启动模式(一)——典型情况下的生命周期分析_第1张图片
针对上图具体说明:
1、针对一个特定的Activity,第一次启动,回调如下: onCreate --> onStart --> onResume;
2、当用户打开新的Activity/切换至桌面,回调如下: onPause--> onStop;
3、当用户再次回到原Activity时,回调如下: onRestart --> onStart --> onResume;
4、当用户点击返回键时,回调如下: onPause --> onStop --> onDestroy;
5、当Activity被系统回收后再次打开,生命周期方法回调过程和(1)一样,注意只是生命周期方法一样,不代表所有过程一样。
记忆时可以成对记忆:
 onCreate和onDestroy是配对的,创建与销毁,只可能有一次调用;
 onStart和onStop是成对的,开始与停止,可能被多次调用;
onResume和onPause是配对的,可能被多次调用。
注意:启动新Activity的时候旧的Activity先onPause,新Activity才开始启动,运行代码会让我们更直观的明白Activity的生命周期。
package com.neusoft.finance.explore.activity.activitylife;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;

import com.neusoft.finance.R;

public class FirstLifeActivity extends Activity {
    private static final String TAG = "FirstLifeActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_first_life);
        Log.d(TAG, "onCreate: ");
        findViewById(R.id.btnNewActivity).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(FirstLifeActivity.this, SecondLifeActivity.class));
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }
}
package com.neusoft.finance.explore.activity.activitylife;

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

import com.neusoft.finance.R;

public class SecondLifeActivity extends Activity{
    private static final String TAG = "SecondLifeActivity";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d(TAG, "onCreate: ");
        setContentView(R.layout.activity_second_life);
        findViewById(R.id.btnBack).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "onStart: ");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "onResume: ");
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "onPause: ");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "onStop: ");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "onDestroy: ");
    }
}


FirsLifeActivity的xml资源文件:


    
SecondLifeActivity的xml资源文件:


    
注意:Activity启动之前需要在AndroidManifest.xml中注册:
        
        
运动代码,我们可以在Log中看到日志如下:
启动第一个Activity时:
02-07 09:38:10.052 7379-7379/com.neusoft.finance D/FirstLifeActivity: onCreate: 
02-07 09:38:10.052 7379-7379/com.neusoft.finance D/FirstLifeActivity: onStart: 
02-07 09:38:10.052 7379-7379/com.neusoft.finance D/FirstLifeActivity: onResume: 
 启动第二个Activity时:
02-07 09:43:37.492 14509-14509/com.neusoft.finance D/FirstLifeActivity: onPause: 
02-07 09:43:37.492 14509-14509/com.neusoft.finance D/SecondLifeActivity: onCreate: 
02-07 09:43:37.492 14509-14509/com.neusoft.finance D/SecondLifeActivity: onStart: 
02-07 09:43:37.502 14509-14509/com.neusoft.finance D/SecondLifeActivity: onResume:
02-07 09:43:37.982 14509-14509/com.neusoft.finance D/FirstLifeActivity: onStop: 
 返回第一个Activity时:

02-07 09:46:24.752 14509-14509/com.neusoft.finance D/SecondLifeActivity: onPause: 
02-07 09:46:24.752 14509-14509/com.neusoft.finance D/FirstLifeActivity: onRestart: 
02-07 09:46:24.752 14509-14509/com.neusoft.finance D/FirstLifeActivity: onStart: 
02-07 09:46:24.752 14509-14509/com.neusoft.finance D/FirstLifeActivity: onResume: 
02-07 09:46:25.192 14509-14509/com.neusoft.finance D/SecondLifeActivity: onStop: 
02-07 09:46:25.192 14509-14509/com.neusoft.finance D/SecondLifeActivity: onDestroy: 
 从日志中我们注意到:
 首次启动一个Activity执行的生命周期: onCreate --> onStart --> onResume;
 再次启动第二个Activity,原Activity首先执行onPause回调,新Activity才开始执行 onCreate --> onStart --> onResume,
新Activity执行完onResume回调后,原Activity执行onStop生命周期;
 当finish第二个Activity时,第二个Activity首先执行onPause方法,然后原Activity执行onRestart --> onStart --> onResume,
第二个Activity才开始执行onStop --> onDestroy。
总结:
 通过日志我们可以看出它们的调用顺序,Android的官方文档对onPause的解释有这么一句,不能在onPause中做重量级的操作,因为
必须onPause执行完成以后新Activity才能Resume,所以onPause和onStop都不能执行耗时的操作,尤其是onPause.









   

你可能感兴趣的:(Android Activity的生命周期和启动模式(一)——典型情况下的生命周期分析)