浅谈Activity生命周期

一、Activity的简介

Activity是Android应用程序的入口(尽管随着Fragment的使用,我们进入应用最先看到的不一定是Activity),是Android中使用最为频繁的组件之一。熟练掌握Activity在各种情况下的生命周期有助于我们定位应用程序运行中的各种异常并优化运行速度。

下面我主要从正常情况和异常情况两个场景来分析Activity的生命周期


二、正常情况下Activity的生命周期

下图是Activity生命周期的切换过程


下面简单介绍一下每个阶段的工作

onCreate:这是Activity生命周期的第一个方法,表明Activity正在被创建。我们可以在这个方法中做一些初始化工作,比如调用setContentView去加载界面布局资源和初始化Activity所需数据等
onRestart:Activity正在重新启动,一般情况下,当Activity重可见状态变为可见转态时,这个方法会被调用。
onStart:Activity正在启动,即将开始,这时Activity已经被创建出来了,但是还没有出现在前台,用户不可见。
onResume:Activity从后台转换到前台,用户可以与之交互了。
onPause:Activity从前台转换到后台,此时Activity不可见。
onStop:Activity即将停止,可以在这里做一些善后工作,但是不能太耗时。
onDestroy:Activity即将被销毁,这是Activity生命周期的最后一个方法,可以在这里做一些回收工作和资源释放。

我们通过运行程序代码来分析Activity的生命周期

package com.android.yanghuaan.activitydemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate invoked.");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.button_start_second_activity);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
                startActivity(intent);
            }
        });
    }

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

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

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

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

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

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


package com.android.yanghuaan.activitydemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

public class SecondActivity extends AppCompatActivity {

    private static final String TAG = "SecondActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate invoked.");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

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

单个Activity
运行过程:启动应用->按home键返回桌面->从最近运行应用列表再次进入应用->按返回键返回桌面
日志输出如下:
05-27 08:17:02.145 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onCreate invoked.
05-27 08:17:02.332 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStart invoked.
05-27 08:17:02.334 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onResume invoked.
05-27 08:17:08.755 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onPause invoked.
05-27 08:17:08.904 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStop invoked.
05-27 08:17:14.682 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onRestart invoked
05-27 08:17:14.682 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStart invoked.
05-27 08:17:14.683 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onResume invoked.
05-27 08:17:25.494 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onPause invoked.
05-27 08:17:26.131 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStop invoked.
05-27 08:17:26.132 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onDestroy invoked.
分析:初次启动应用时,onCreate、onStart和onResume依次被调用,此时Activity出现在前台;然后按HOME键返回桌面,此时应用并没有被操作系统杀死,只是转换到后台了,此时Activity不可见,onPause和onStop依次被调用;再次进入应用,此时Activity并没有重新创建,而是复用了之前的Activity,onRestart、onStart和onResume被调用;按返回键返回桌面,此时应用被查询系统杀死,onPause、onStop和onDestroy依次被调用。
多个Activity
运行过程:启动引用->点击“start second activity” 按钮启动第二个Activity->按返回键返回第一个Activity
日志输出如下:
05-27 08:22:23.331 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onCreate invoked.
05-27 08:22:23.364 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStart invoked.
05-27 08:22:23.367 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onResume invoked.
05-27 08:22:25.534 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onPause invoked.
05-27 08:22:25.550 4408-4408/com.android.yanghuaan.activitydemo D/SecondActivity: onCreate invoked.
05-27 08:22:26.387 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStop invoked.
05-27 08:22:42.459 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onRestart invoked
05-27 08:22:42.460 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onStart invoked.
05-27 08:22:42.460 4408-4408/com.android.yanghuaan.activitydemo D/MainActivity: onResume invoked.
05-27 08:22:43.028 4408-4408/com.android.yanghuaan.activitydemo D/SecondActivity: onDestroy invoked.
分析:在启动SecondActivity时,MainActivity的onPause和onStop被调用,此时MainActivity切换到后台,Second出现在前台;按返回键返回MainActivity后,MainActivity的onRestart、onStart和onResume被调用,MainActivity再次转换到前台。

三、异常情况下Activity的声明周期

当系统配置资源变化时,Activity会被销毁然后使用新的配置资源(如果有的话)重新创建;而当系统可用内存不足时,低优先级的Activity会被销毁来保障高优先级的Activity运行。在这两种情况下,Activity的生命周期与典型情况下的生命周期有所不同。当上述情况发生后,系统会尝试重新恢复之前的Activity运行情况,比如屏幕旋转之后,我们可能希望用户看到的内容不会发生变化(只是布局等发生了变化),为此,操作系统提供了额外的生命周期方法,用来在异常情况发生时保存数据,以便Activity重建是恢复数据。
下图是异常情况下Activity的生命周期:



下面我们通过运行代码来分析这种情况下Activity的生命周期

package com.android.yanghuaan.activitydemo;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    private Button mButton;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate invoked.");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mButton = (Button) findViewById(R.id.button_start_second_activity);

        mButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getApplicationContext(),SecondActivity.class);
                startActivity(intent);
            }
        });
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.d(TAG, "onRestoreInstanceState invoked.");
        super.onRestoreInstanceState(savedInstanceState);
    }

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

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

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

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

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

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.d(TAG, "onSaveInstanceState invoked.");
        super.onSaveInstanceState(outState);
    }

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

运行过程:进入应用->旋转屏幕
日志输出:
05-27 09:22:33.506 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onCreate invoked.
05-27 09:22:33.689 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onStart invoked.
05-27 09:22:33.691 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onResume invoked.
05-27 09:22:38.614 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onPause invoked.
05-27 09:22:38.615 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onSaveInstanceState invoked.
05-27 09:22:38.877 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onStop invoked.
05-27 09:22:38.877 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onDestroy invoked.
05-27 09:22:38.905 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onCreate invoked.
05-27 09:22:38.919 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onStart invoked.
05-27 09:22:38.920 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onRestoreInstanceState invoked.
05-27 09:22:38.921 28799-28799/com.android.yanghuaan.activitydemo D/MainActivity: onResume invoked.
分析:当设备旋转屏幕时,可以看到onSaveInstanceState方法被调用,此时Activity被销毁重建;在重建过程中,onRestoreInstanceState方法被调用。因此,我们可以在onSaveInstanceState方法中保存我们将要恢复的数据,然后在onRestoreInstanceState方法中恢复。
注:本文的关注点是Activity的生命周期,对如何使用onSaveInstanceState方法和onRestoreInstanceState方法的具体用法不在本文探讨范围内。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值