(第二行代码阅读笔记)活动(Activity)的生命周期

活动(Activity)的生命周期


1、活动的状态

  • 1、运行状态:当一个活动位于返回栈顶时,这时活动就处于运行状态。系统最不愿意回收的就是运行状态的活动。
  • 2、暂停状态:当一个活动不再处于栈顶位置,但仍然可见时,这是活动就进入了暂停状态。
  • 3、停止状态:当一个活动不再处于栈顶位置,并且完全不可见的时候,就进入了停止状态。
  • 4、销毁状态:当一个活动从返回栈中移除后就变成了销毁状态。

2、活动的生存期

  • 生命周期流程图(来自官方文档):

    image

  • onCreate()。活动第一次被创建的时候被调用,在该方法中完成活动的初始化操作,比如加载布局、绑定事件等。

  • onStart()。活动由不可见变为可见的时候调用。
  • onResum()。活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。
  • onPause()。系统准备启动或恢复另一个活动的时候被调用。我们常会在这个方法中将一些消耗CPU的资源释放叼,以及保存一些关键数据,但这个方法执行速度一定要快,不然会影响到新的栈顶活动的使用。
  • onStop()。在活动完全不可见的时候调用。
  • onDestroy()。在活动被销毁之前调用,之后活动的状态变成销毁状态。
  • onRestart()。活动由停止状态变为运行状态之前调用,也就时活动被重新启动了。

3、体验活动的生命周期

讲了那么多理论知识,也是时候实战一下了,下面我们将通过一个实例,更加直观的体验活动的生命周期。

现在编辑normal_layout.xml,布局非常简单,只有一个TextView用于显示一行文字:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.linbots.activitytestdemo.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="This is NormalActivity"
        android:textColor="#333333"
        android:textSize="24sp" />

</LinearLayout>

然后,我们再来链接dialog_layout.xml,只需要将上面的代码copy,更换显示文字即可:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.linbots.activitytestdemo.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:text="This is DialogActivity"
        android:textColor="#333333"
        android:textSize="24sp" />

</LinearLayout>

两个布局文件的代码几乎没有区别,只是显示的文字不同而已。

NormalActivity 和 DialogActivity中的代码我们保持默认就好了,不需要做任何改动。

其实,我们单从这两个活动的名字上就可以看出,这两个活动一个普通的活动,一个是对话框式活动。把普通活动设置成对话框式活动,我们只需要修改AndroidManifest.xml的配置:

        <activity
            android:name=".DialogActivity"
            android:theme="@style/Theme.AppCompat.Dialog" />

main_layout.xml布局里有两个Button,这里就不贴代码了。MainActivity中的代码如下:


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

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate");
        setContentView(R.layout.main_layout);

        findViewById(R.id.start_normal_aty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, NormalActivity.class));
            }
        });

        findViewById(R.id.start_dialog_aty).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, DialogActivity.class));
            }
        });

    }

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

    @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, "onDestroy");
    }

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

可以看到,MainActivity中分别为两个按钮注册了点击事件,然后在Activity的7个回调方法中分别打印了一句话,这样我们就可以通过观察日志的方式来更直观的理解活动的生命周期。

现在运行程序,效果图如下:

这里写图片描述

这时观察logcat中的打印日志:

这里写图片描述

可以看到,当MainActivity第一次被创建时会依次执行 onCreate()、onStart()、onResume()方法。然后我们点击第一个Button,启动NormalActivity:

这里写图片描述

此时的打印信息如下:

这里写图片描述

由于MainActivity已经被NormalActivity完全挡住,因此onPause()和onStop()方法都会执行。然后按下Back键返回MainActivity,打印信息如下:

这里写图片描述

由于之前MainActivity已经进入了停止状态,所有onRestart()方法会得到执行,之后又会依次执行onStart()、onResume()方法(注意此时onCreate()方法并不执行)。

然后点击第二个Button,启动DialogActivity,如图:

这里写图片描述

此时logcat信息如下:

这里写图片描述

可以看到,只有 onPause()方法等到执行,onStop()方法并没有执行,这是因为此时DialogActivity并没有完全的把MainActivity遮挡住,MainActivity只是进入了暂停状态,并没有进入停止状态。按下Back返回MainActivity也只有onResume()方法会得到执行:

这里写图片描述

最后,在MainActivity按Back键退出程序,打印的logcat如下:

这里写图片描述

依次会执行onPause()、onStop() 和 onDestroy() 方法,最终销毁MainActivity


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值