理解Android生命周期

news2025/1/10 21:12:58

在这里插入图片描述

写一个demo,实现两个页面之间的跳转。重写7个生命周期方法,在方法中打印日志,观察状态的变化。

MainActivity

设置一个常量。

private static final String TAG = "hello_activity_1";

重写7个生命周期。

在生命周期方法中,如果设备调用该方法,则使用日志的方式打印出来。

Log.d(TAG, "Activity_1 onCreate");

MainActivity_1.java

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

/**
 * 继承AppCompatActivity类,
 * 需要在AndroidManifest.xml文件中
 * 指定 android:theme="@style/Theme.AppCompat.xxx"
 */
public class MainActivity extends AppCompatActivity {
    private static final String TAG = "hello_activity_1";

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


        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setClass(MainActivity.this, MainActivity_2.class);
                startActivity(intent);
            }
        });
    }

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

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

    }

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

    }

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

    }

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

    }

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

    }

}

MainActivity_2.java

package com.example.myapplication;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity_2 extends AppCompatActivity {
    private static final String TAG = "hello_activity_2";

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent();
                intent.setClass(MainActivity_2.this, MainActivity.class);
                startActivity(intent);
            }
        });

    }

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

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

    }

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

    }

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

    }

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

    }

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

    }
}

启动

控制台信息

---------------------------- PROCESS STARTED (14765) for package com.example.myapplication ----------------------------
2023-08-04 14:50:43.868 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onCreate
2023-08-04 14:50:44.013 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStart
2023-08-04 14:50:44.016 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onResume

onCreate()

系统在首次创建Activity时会调用,进入“已创建”的状态。

在onCraete()方法中通过setContentView()方法指定布局文件。

setContentView(R.layout.activity_main);

onStart()

系统调用onStart()方法,进入“已开始”状态。

应用通过此方法来初始化维护界面的代码。

onResume()

Activity不会一直处于“已开始”状态。一旦此回调结束,Activity 便会进入“已恢复”状态,系统将调用onResume()方法。

这是应用与用户互动的状态。应用会一直保持这种状态,直到某些事件发生,让焦点远离应用。此类事件包括接到来电、用户导航到另一个 Activity,或设备屏幕关闭。

点击跳转按钮

控制台信息

---------------------------- PROCESS STARTED (14765) for package com.example.myapplication ----------------------------
2023-08-04 14:50:43.868 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onCreate
2023-08-04 14:50:44.013 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStart
2023-08-04 14:50:44.016 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onResume
2023-08-04 14:51:00.845 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onPause
2023-08-04 14:51:00.885 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onCreate
2023-08-04 14:51:00.887 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onStart
2023-08-04 14:51:00.890 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onResume
2023-08-04 14:51:01.561 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStop

分析

activity_1

从日志信息中可以看到,activity_1调用了**onPause()**方法,进入了“已暂停”状态。

activity_2:

activity_2调用了**onCreate() onStart() onResume()**方法。

activity_1

在activity_2调用结束后,activity_1调用了**onStop()**方法。

onPause()

已暂停”状态,此时activity_1还没有被销毁,只是不再位于前台(可能在后台,资源并没有完全释放?)。

activity_1会保持这个状态,直到其恢复或者变成对用户完全不可见。

  • 若恢复,系统将再次调用onResume(),之后,系统会让Activity实例继续驻留在内存中。
  • 若变成完全不可见,系统会调用onStop()。

onStop()

在activity_2调用结束后,activity_1调用了**onStop()**方法。在生命周期图中onStop()已经是倒数第二步,应用应释放或调整在应用对用户不可见的无用资源。

进入“已停止”状态后,Activity对象会继续驻留在内存中,Activity的后续活动:

  • 返回与用户互动,系统将调用onRestart()。
  • 结束运行并消失,系统将调用onDestroy()。

跳转回第一个页面

控制台信息

---------------------------- PROCESS STARTED (14765) for package com.example.myapplication ----------------------------
2023-08-04 14:50:43.868 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onCreate
2023-08-04 14:50:44.013 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStart
2023-08-04 14:50:44.016 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onResume
2023-08-04 14:51:00.845 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onPause
2023-08-04 14:51:00.885 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onCreate
2023-08-04 14:51:00.887 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onStart
2023-08-04 14:51:00.890 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onResume
2023-08-04 14:51:01.561 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStop
2023-08-04 15:21:56.684 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onPause
2023-08-04 15:21:56.705 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onCreate
2023-08-04 15:21:56.749 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStart
2023-08-04 15:21:56.752 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onResume
2023-08-04 15:21:57.367 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onStop

在任务栏上划应用

控制台信息

---------------------------- PROCESS STARTED (14765) for package com.example.myapplication ----------------------------
2023-08-04 14:50:43.868 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onCreate
2023-08-04 14:50:44.013 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStart
2023-08-04 14:50:44.016 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onResume
2023-08-04 14:51:00.845 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onPause
2023-08-04 14:51:00.885 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onCreate
2023-08-04 14:51:00.887 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onStart
2023-08-04 14:51:00.890 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onResume
2023-08-04 14:51:01.561 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStop
2023-08-04 15:21:56.684 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onPause
2023-08-04 15:21:56.705 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onCreate
2023-08-04 15:21:56.749 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStart
2023-08-04 15:21:56.752 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onResume
2023-08-04 15:21:57.367 14765-14765 hello_activity_2        com.example.myapplication            D  Activity_2 onStop
2023-08-04 15:22:51.099 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onPause
2023-08-04 15:22:51.134 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onStop
2023-08-04 15:23:39.091 14765-14765 hello_activity_1        com.example.myapplication            D  Activity_1 onDestroy

分析

我将缩小进入任务栏和上划释放两个步骤间隔了一段时间,可以看出,在最终的销毁之前,activity_1和activity_2都会调用onStop()进入停止状态。

onDestroy()

销毁”状态,释放所有的资源。系统调用此回调的原因如下:

  • Activity即将结束,用户彻底的关闭了Activity或者系统为Activity调用了finish()。
  • 由于配置变更,例如:设备旋转、多窗口模式,系统暂时销毁activity。

参考文档
https://developer.android.google.cn/guide/components/activities/activity-lifecycle?hl=zh-cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/836005.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

No primary or single unique constructor found for interface java.util.List

报错截图: 报错内容: 2023-08-04 15:46:32.884 ERROR 14260 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing fa…

对当下AI的一些观感思考

目前来看,AI技术地震的震中还是在美帝那旮瘩。尤其是M7,这几家市值加总快15万亿美元了,个个都是行业翘楚,个个都有拿得出手的东西。AI是个技术密集、人才密集、计算密集的产业。美帝拥有全球一流的顶尖人才,以及财力、…

【Leetcode】(自食用)树的中序遍历(递归+栈非递归)

step by step. 题目: 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2]示例 2: 输入:root [] 输出:[]示例 3: 输入…

【LNMP】LNMP

LNMP:是目前成熟的企业网站的应用模式之一,指的是一套协同工作的系统和相关软件;能够提供静态页面服务,也可以提供动态web服务 L Linux系统,操作系统N Nginx网站服务,前端,提供前端的静态…

接口抓包,Fiddler抓包使用方法总结,入门到精通辅助实战...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 工作原理 Fiddle…

性能全面飙升!StarRocks 在贝壳找房的极速统一实践

小编导读: 贝壳找房是国内最大的在线房产交易平台之一,利用大数据技术进行房源的挖掘和匹配,通过数据分析和挖掘,更准确地了解用户需求,并为用户提供个性化的房源推荐和交易服务。 随着数据和业务规模的增长&#xff0…

carla中lka实现(一)

前言: 对于之前项目中工作内容进行总结,使用Carla中的车辆进行lka算法调试,整体技术路线: ①在Carla中生成车辆,并在车辆上搭载camera,通过camera采集图像数据; ②使用图像处理lka算法&#…

echart图标日环图

效果图&#xff1a; 代码实例&#xff1a; <template><div id"chart-alarm" class"chartStyle"></div> </template> <script> import echarts from echarts export default {name:alarm,data(){return{chart:null}},mounte…

mybatisplus集成geometry实现增改功能

前言 在我们工作中想要实现将空间点位信息存储到数据库时,一般使用以下语句实现 INSERT INTO test-point ( point,text ) VALUES ( st_GeomFromText ( POINT(1 1) ),第1个点);update test-point set pointst_PointFromText(POINT(5 5)) where id 10;但是这样每次都要去编写新…

介绍个小工具 - ABAP Cleaner

1. 背景 在编写ABAP代码时&#xff0c;我们可以通过Pretty Printer &#xff08;Shift F1&#xff09;去完成代码的美化&#xff0c;但Pretty Printer所能提供的仅仅是关键字大小写的设置、以及行首留空格的控制&#xff0c;如下图所示。 也就是说&#xff0c;Pretty Printer…

【MySQL】仓储--维护出入库流水、库存,去重数量逻辑修正

系列文章 C#底层库–MySQLBuilder脚本构建类&#xff08;select、insert、update、in、带条件的SQL自动生成&#xff09; 本文链接&#xff1a;https://blog.csdn.net/youcheng_ge/article/details/129179216 C#底层库–MySQL数据库操作辅助类&#xff08;推荐阅读&#xff0…

【QNX】快速入门指南

目录 1.QNX 快速入门指南 2.系统要求 2.安装 QNX Momentics 开发套件 3.安装 QNX Neutrino 实时操作系统 4.QNX Neutrino 操作系统的联网 1.QNX 快速入门指南 本指南旨在帮助用户安装和配置 QNX Momentics 工具与 QNX Neutrino 操作系统&#xff0c;以便用户立即进行程序开…

Mybatis 实体类属性名和表中字段名不一致怎么处理

一. 前言 最近耀哥有学生出去面试&#xff0c;被问到 “Mybatis实体类的属性名和表中的字段名不一致该怎么处理&#xff1f;”&#xff0c;这其实是一个很经典的面试题&#xff0c;接下来耀哥就为大家详细解析一下这道面试题。 二. 分析 2.1 实体类和字段名不一致所带来的后果…

<C/C++>日期和时间的使用(time相关函数大全)

1、函数详解及示例 1- time_t time(time_t *time); 1&#xff09;功能&#xff1a;获取或设置系统时间。 2&#xff09;参数&#xff1a;若给定参数&#xff0c;则将当前时间保存到该参数中&#xff1b;若不给定参数&#xff0c;参数填NULL。 3&#xff09;返回值&#xff1…

CANDela Cdd 文件和CddT文件的相互转化

cdd转cddT Step1 点击Check Consistency , step2 没有任何error step1 选择Convert Document to Template , 然后选择想要转换的文件 保存cddt文件 cddT转cdd cddt文件的可编辑权限更高&#xff0c;但是在diva工程和canoe中只能使用cdd文件&#xff0c;所以&#xff0c;我们…

跑步用哪款耳机比较好、最适合跑步用的蓝牙耳机推荐

运动时聆听音乐可以为枯燥的过程带来娱乐&#xff0c;并且能够转移注意力&#xff0c;让人忽略身体负荷带来的不适感。而一款出色的运动耳机则成为锻炼过程中的重要辅助&#xff0c;它能够帮助控制节奏&#xff0c;使运动过程更加愉悦和高效。以下是一些备受推崇的热门运动耳机…

EventBus 开源库学习(一)

一、概念 EventBus是一款在 Android 开发中使用的发布-订阅事件总线框架&#xff0c;基于观察者模式&#xff0c;将事件的接收者和发送者解耦&#xff0c;简化了组件之间的通信&#xff0c;使用简单、效率高、体积小。 一句话&#xff1a;用于Android组件间通信的。 二、原理…

Windows环境下VSCode安装PlatformIO Cero报错ERROR: HTTP error 403 while getting

安装PlatformIO插件成功&#xff0c;初始化失败 错误信息判断问题尝试访问https://pypi.tuna.tsinghua.edu.cn/simple/platformio/成功点击文件后报错如下&#xff1a; 解决问题- 换源 &#xff08; Windows下有两个地方需要更改&#xff09;cmd命令行Pip文件 总结&#xff1a;…

C语言指针操作数组赋值

1、通过指针修改数组元素的值 ps:int a[10] {10}; 数组名a &a[0] a1 &a[0]1 跨过得是数组元素类型的长度&#xff0c;&a是对整个数组取地址&#xff0c;&a1是跨过整个数组的长度 #include "stdio.h" #include <stdlib.h>int main() {i…

LeetCode-654-最大二叉树

一&#xff1a;题目描述 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回…