实操理解activity生命周期 | 青训营笔记

70 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第2天

作者: Eric0202

前言:

学习安卓最先接触的应该就是四大组件里面的activity了, 就像学习c语言, 所有人最先接触的就是控制台

printf("hello world!");

安卓也一样, Android Studio新建一个空的工程后, 打开的可能(根据AS和初始选择的页面不同) 就是一个显示了activity的页面.

AS也有控制台, 也可以像c一样在控制台输出hello world, 显示调试信息等等. 但是页面显示可能对于很多初学者来说, 还是没有接触过的, 如果是的话, 就恭喜你, 完成了自己的第一个GUI程序.

学习activity通常最先学的就是activity生命周期. 但是作为初学者, 看到一大堆与生命周期相关的方法, 又很难记得住. 所以最简单实用的就是写一个最简洁的程序, 在控制台观察过程.


正文:

步骤:

1.

首先为我们的第一个activity写一个界面, 最好在页面上显示这个就是第一个activity, 方便后续分辨, 这里我放入了一个textview和两个button

image-20220724205653968.png

xml

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">
​
    <TextView
        android:id="@+id/text_activity1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:text="This is activity1"
        android:layout_marginTop="20dp"
        android:textColor="@color/black"
        android:textSize="26sp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />
​
​
    <Button
        android:id="@+id/btn1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="click to open baidu"
        android:layout_marginTop="30dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/text_activity1" />
​
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn2"
        android:layout_marginTop="30dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn1"
        android:text="click to go to activity2"
        />
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/btn3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/btn2"
        android:layout_marginTop="30dp"
        android:text="this is currently empty"
        />
​
​
​
</androidx.constraintlayout.widget.ConstraintLayout>
2.

然后在java文件里override生命周期的方法, 并且每个都在控制台打印当前周期, 通过log.e会打印出红色的信息error

public class MainActivity extends AppCompatActivity {
​
​
    @Override
    protected void onStart() {
        super.onStart();
        Log.e("e","activity1 on start");
​
    }
​
    @Override
    protected void onPostResume() {
        super.onPostResume();
        Log.e("e","activity1 on resume");
​
    }
​
    @Override
    protected void onStop() {
        super.onStop();
        Log.e("e", "activity1 on stop");
    }
​
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.e("e", "activity1 on destroy");
​
    }
​
    @Override
    protected void onPause() {
        super.onPause();
        Log.e("e","activity1 on pause");
    }
​
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.e("e","activity1 on restart");
    }
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.e("e", getClass().getSimpleName()+" activity1 on create");
​
    }
3.

运行一次试试

2022-07-24 20:55:00.896 6798-6798/com.example.myapplication E/e: MainActivity activity1 on create
2022-07-24 20:55:00.897 6798-6798/com.example.myapplication E/e: activity1 on start
2022-07-24 20:55:00.899 6798-6798/com.example.myapplication E/e: activity1 on resume

经过以上过程activity成功运行在前台, 然后返回

2022-07-24 21:05:17.923 6798-6798/com.example.myapplication E/e: activity1 on pause
2022-07-24 21:05:18.071 6798-6844/com.example.myapplication D/EGL_adreno: eglMakeCurrent: 0xb6e898e0: ver 3 1 (tinfo 0xc7c1abe0)
2022-07-24 21:05:18.138 6798-6798/com.example.myapplication E/e: activity1 on stop
2022-07-24 21:05:18.138 6798-6798/com.example.myapplication E/e: activity1 on destroy

这就是一次正常生命周期

截图:

image-20220724210651570.png

但是通常我们都需要在activity之间切换, 于是我们加上第二个activity, 并且为了显示方便, 换一种log打印方式

1.

编写xml, 与activity1相似就不贴上来了

2.

同上, 但是log打印改为info打印

    @Override
    protected void onStart() {
        super.onStart();
        Log.i("e","activity2 on start");
​
    }
3.

通过activity1启动activity2并返回activity1

截图:

image-20220724211717865.png

image-20220724211744295.png

通过不同的颜色应该可以看的比较清楚, 两个activity之间切换时的生命周期变化, 每次在前台(栈顶)的activity都是onResume状态, 切换下一个时先pause, 然后下一个被置于栈顶onResume.

自己写完代码运行一遍会比只看一眼别人的教程记得清楚很多, 教程里面这仅仅是 几个单词几个箭头 就能全部表示完. 但是自己操作一下才能比较清楚的认识.

2022年7月24日