【Android Studio开发】生命周期、Activity和组件通信(上)
零、前期配置
1.【Android】模式

2.点击【运行】,弹出模拟器

右侧是模拟机,显示Hello World

3. 打开【activity_main.xml】文件,点击【Design】,然后点击【Component Tree】

在弹出的Component Tree中右键【main】,选择【Convert view...】

选中第二个【LinearLayout】 然后点击【Apply】

可见布局发生变化:

代码结构也发生变化:

在 Android 开发里,布局文件、活动文件和配置文件是至关重要的组成部分,编写代码也是按照以上顺序,下面分别为你介绍以下三个文件:

一、布局文件activity_main.xml
布局文件,它定义了界面的外观和结构。布局文件是 XML 格式,存放在 res/layout 目录下。以下是一个简单的线性布局示例,包含一个文本视图和一个按钮:
<?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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World!" /></LinearLayout>
- 整体布局:使用
LinearLayout作为根布局,它就像一个 “盒子”,可以把里面的元素按照一定方向排列(这里默认是水平排列)。android:layout_width="match_parent"和android:layout_height="match_parent"表示这个 “盒子” 的宽度和高度要和它的父容器(也就是手机屏幕)一样大。- 设置了android:id="@+id/main",为该布局分配了一个唯一标识符main,以便在Java代码中引用。
TextView文本显示:在这个 “盒子” 里放了一个TextView,它的作用是显示文本。android:text="Hello World!"就是要显示的内容android:layout_width="wrap_content"和android:layout_height="wrap_content"表示这个文本框的宽度和高度会根据显示的文本内容自动调整。- tools:context=".MainActivity"指定了该布局与MainActivity相关联,便于在设计视图中预览
二、活动文件MainActivity.java
活动文件,它负责处理业务逻辑和与用户的交互,比如加载布局文件,处理用户的操作等。活动文件通常用 Java 或 Kotlin 编写,存放在 java 或 kotlin 目录下。以下是使用 Java 编写的一个简单活动示例:
package com.example.a04;import android.os.Bundle;import androidx.activity.EdgeToEdge;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);EdgeToEdge.enable(this);setContentView(R.layout.activity_main);ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);return insets;});}
}
这段Java代码定义了一个名为MainActivity的Android活动类,主要功能如下:
- 继承与初始化:继承自AppCompatActivity,并重写了onCreate方法,用于初始化活动。
- 全屏模式支持:调用EdgeToEdge.enable(this)启用边缘到边缘(Edge-to-Edge)显示模式,允许内容延伸到屏幕边缘(如状态栏、导航栏下方)。
- 设置布局:
setContentView()绑定布局文件,将 XML 布局渲染为可视化界面。通过setContentView(R.layout.activity_main),加载activity_main.xml布局文件作为界面。 ViewCompat.setOnApplyWindowInsetsListener:给布局根视图(id为main)设置一个监听事件,当系统的状态栏和导航栏的位置发生变化时,就会触发这个事件。在这个事件里,会获取状态栏和导航栏的高度(Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())),然后给布局设置内边距(v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)),这样布局里的内容就不会被状态栏和导航栏挡住了。
三、配置文件AndroidManifest.xml
在 AndroidManifest.xml 文件中声明活动,让系统知道应用中有哪些活动以及它们的入口信息。该文件存放在项目的根目录下。
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme._04"tools:targetApi="31"><activityandroid:name=".MainActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
该AndroidManifest.xml文件定义了Android应用的基本配置和组件信息:
根标签 <manifest>
- 声明了命名空间xmlns:android和xmlns:tools,用于访问Android框架属性和开发工具属性。
应用级配置<application> 标签:
- allowBackup="true":允许对这个应用的数据进行备份。
- label:设置应用的名称,这个名称会显示在手机桌面上。
- icon 和 roundIcon:指定应用图标资源。
- theme:设置应用的主题样式为@style/Theme._04。
- supportsRtl="true":支持从右到左的语言布局。
活动组件声明<activity> 标签:
- 声明了这个应用里有一个名为MainActivity的活动,并设置为可导出(exported="true")表示这个活动可以被其他应用调用。
- 通过intent-filter指定该活动为主入口点,包含MAIN动作和LAUNCHER类别。
<intent-filter> 标签
<action android:name="android.intent.action.MAIN" />和<category android:name="android.intent.category.LAUNCHER" />:这两个标签组合起来表示MainActivity是这个应用的启动活动,当用户点击手机桌面上的应用图标时,就会启动这个活动,就像打开房子的大门。
四、编写代码步骤---ActivityLifeCycle示例
下面以ActivityLifeCycle示例来进行说明Activity事件回调函数, ActivityLifeCycle示例的运行界面

步骤 1:布局文件
activity_main.xml
- 在这个示例中,我们将创建一个简单的布局,包含一个TextView和一个Button。
<?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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="Hello World, ActivityLifeCycleActivity!"android:textSize="24sp" /><Buttonandroid:id="@+id/btn_finish"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="结束程序" /></LinearLayout>
步骤 2:创建活动文件
ActivityLifeCycleActivity.java
- 创建一个Java类文件,命名为
ActivityLifeCycleActivity.java - 该文件将继承自
Activity类,并重写其生命周期回调方法。
package com.example.a04;import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;public class ActivityLifeCycleActivity extends Activity {private static String TAG = "LIFECYCLE";// 完全生命周期开始时被调用,初始化Activity@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Log.i(TAG, "(1) onCreate()");// 定义按钮和按钮监听函数Button button = (Button) findViewById(R.id.btn_finish);button.setOnClickListener(new View.OnClickListener() {public void onClick(View view) {finish();}});}// 可视生命周期开始时被调用,对用户界面进行必要的更改@Overridepublic void onStart() {super.onStart();Log.i(TAG, "(2) onStart()");}// 在onStart()后被调用,用于恢复onSaveInstanceState()保存的用户界面信息@Overridepublic void onRestoreInstanceState(Bundle savedInstanceState) {super.onRestoreInstanceState(savedInstanceState);Log.i(TAG, "(3) onRestoreInstanceState()");}// 在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源@Overridepublic void onResume() {super.onResume();Log.i(TAG, "(4) onResume()");}// 在活动生命周期结束时被调用,用来保存界面信息@Overridepublic void onSaveInstanceState(Bundle savedInstanceState) {super.onSaveInstanceState(savedInstanceState);Log.i(TAG, "(5) onSaveInstanceState()");}// 在重新进入可视生命周期前被调用,载入界面所需要的更改信息@Overridepublic void onRestart() {super.onRestart();Log.i(TAG, "(6) onRestart()");}// 在活动生命周期结束时被调用,用来保存持久的数据。@Overridepublic void onPause() {super.onPause();Log.i(TAG, "(7) onPause()");}// 在可视生命周期结束时被调用,释放或调整 应用对用户不可见时不需要的资源。@Overridepublic void onStop() {super.onStop();Log.i(TAG, "(8) onStop()");}// 在完全生命周期结束时被调用,释放资源,包括线程、数据连接等@Overridepublic void onDestroy() {super.onDestroy();Log.i(TAG, "(9) onDestroy()");}
}
步骤 3:配置文件
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"><applicationandroid:allowBackup="true"android:dataExtractionRules="@xml/data_extraction_rules"android:fullBackupContent="@xml/backup_rules"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/Theme._04"tools:targetApi="31"><activityandroid:name=".ActivityLifeCycleActivity"android:exported="true"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter></activity></application></manifest>
项目结构:

按照这样的顺序编写代码,能让你先设计好界面,再实现业务逻辑,最后完成应用的整体配置,使开发过程更加有条理。
步骤 4:LogCat
上面的程序主要通过在生命周期函数中添加“日志点”的方法进行调试, 程序的运行结果将会显示在LogCat中,但是LogCat中有很多其他信息。

所以,为了显示结果易于观察和分析,在LogCat设置过滤器LifeCycleFilter,过滤方法选择by Log Tag,过滤关键字为LIFECYCLE。

【运行】程序,此时LogCat已经输出124,然后点击【结束程序】

LogCat输出完整结果124789

完全生命周期:

相关文章:
【Android Studio开发】生命周期、Activity和组件通信(上)
零、前期配置 1.【Android】模式 2.点击【运行】,弹出模拟器 右侧是模拟机,显示Hello World 3. 打开【activity_main.xml】文件,点击【Design】,然后点击【Component Tree】 在弹出的Component Tree中右键【main】,选择【Conver…...
【ES】Elasticsearch学习
文章目录 简单的安装 简单的安装 参考:https://blog.csdn.net/smilehappiness/article/details/118466378 官网:https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html 下载:https://www.elastic.co/cn/downloads/e…...
实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)
一、实验目的 Python 数据可视化: 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means: 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…...
【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)
通信接口部分有介绍SPI:【STM32】USART串口协议&串口外设-学习笔记-CSDN博客 SPI通信协议 SPI通信 SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock&…...
JavaScript实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。
大白话实现一个函数,将数组扁平化(flatten),即把多维数组转为一维数组。 思路 实现数组扁平化的基本思路是遍历数组中的每个元素,如果元素是数组,就递归地将其扁平化并添加到结果数组中;如果元…...
SpringBoot最佳实践之 - 使用AOP记录操作日志
1. 前言 本篇博客是个人在工作中遇到的需求。针对此需求,开发了具体的实现代码。并不是普适的记录操作日志的方式。以阅读本篇博客的朋友,可以参考此篇博客中记录日志的方式,可能会对你有些许帮助和启发。 2. 需求描述 有一个后台管理系统…...
第六届机电一体化技术与智能制造国际学术会议(ICMTIM 2025)
重要信息 4月11-13日 南京江北新区工业大学亚朵酒店 www.icmtim.org(点击了解参会投稿等) 简介 由南京工业大学主办,南京工业大学电气工程与控制科学学院、中国矿业大学、黑龙江大学、江苏省自动化学会承办的第六届机电一体化技术…...
numpy学习笔记4:np.arange(0, 10, 2) 的详细解释
numpy学习笔记4:np.arange(0, 10, 2) 的详细解释 以下是 np.arange(0, 10, 2) 的详细解释: 1. 函数作用 np.arange() 是 NumPy 中用于生成均匀间隔数值序列的函数,类似于 Python 内置的 range(),但返回的是 NumPy 数组而非列表&…...
期刊分区表2025年名单下载(经济学、管理学)
2025年期刊分区表包括SCIE、SSCI、A&HCI、ESCI和OAJ,共设置了包括自然科学、社会科学和人文科学在内的21个大类 本次分享的是期刊分区表2025年名单经济学类、管理学类,一共7631025条 一、数据介绍 数据名称:期刊分区表2025年名单 数据…...
八股学习-JUC java并发编程
本文仅供个人学习使用,参考资料:JMM(Java 内存模型)详解 | JavaGuide 线程基础概念 用户线程:由用户空间程序管理和调度的线程,运行在用户空间。 内核线程:由操作系统内核管理和调度的线程&…...
嵌入式笔记 | 正点原子STM32F103ZET6 4 | 中断补充
1. 外设引脚重映射 1.1 定义 在STM32中,每个外设的引脚都有默认的GPIO端口,但有些引脚可以通过重映射寄存器将功能映射到其他端口。这种机制称为引脚重映射,主要用于解决引脚复用冲突或优化PCB布线。 1.2 重映射的类型 部分重映射&#x…...
PostgreSQL_数据下载并保存(psycopg2)
目录 前置: 1 数据下载 1.1 多个股票多个交易日 1.2 一个交易日所有股票 2 数据保存,使用python中的psycopg2包 2.1 在PyCharm中创建新项目,并安装包 2.2 代码-多个股票多个交易日 2.3 代码-一个交易日所有股票 2.4 在 pgAdmin4 中…...
启明星辰春招面试题
《网安面试指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇网安资料库https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…...
边缘计算革命:重构软件架构的范式与未来
摘要 边缘计算通过将算力下沉至网络边缘,正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新,包括分布式分层架构、实时资源调度、安全防护体系等技术变革,并结合工业物联网、智慧医疗等场景案例,…...
【读点论文】Chain Replication for Supporting High Throughput and Availability
在分布式系统中,强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库,其保证了强一致性,但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库,虽然其吞吐量、和扩展性很高,但往往只支持最终一致性,无…...
Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理
DAY15.1 Java核心基础 Servlet Servlet是一个接口,是java的基础,java之所以编写web的程序,接收请求并响应,就是因为Sevlet接口 Java 类实现了Servlet接口的时候就可以接收并响应请求,成为web服务器 Web服务器就是接…...
深入了解 C# 中的 LINQ:功能、语法与应用解析
1. 什么是 LINQ? LINQ(Language Integrated Query,语言集成查询)是 C# 和其他 .NET 语言中的一种强大的查询功能,它允许开发者在语言中直接执行查询操作。LINQ 使得开发者可以使用 C# 语法(或 VB.NET&…...
贝叶斯公式的一个直观解释
E E E:抓到娃娃 H H H:坐地铁 H ˉ \bar H Hˉ:坐公交 P ( E ) P ( H ) P ( E ∣ H ) P ( H ‾ ) P ( E ∣ H ‾ ) P({E}) P({H}) P({E} \mid {H}) {P}(\overline{{H}}) {P}({E} \mid \overline{{H}}) P(E)P(H)P(E∣H)P(H)P(E∣H) P (…...
Java 大视界 -- Java 大数据分布式计算中的通信优化与网络拓扑设计(145)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
reconstruct_3d_object_model_for_matching例子
文章目录 1.获取om3文件2.准备可视化3.准备3D可视化4.读取3D模型5.显示成对注册结果16.显示成对注册结果27.联合注册模型8.处理图像8.1子采样8.2 图像计算与平滑8.3 三角测量 9.基于表面做3D匹配10.评估模型准确度10.1 在场景中找到模型10.2 计算模型和场景之间的距离 11.立体系…...
【JavaWeb学习Day27】
Tlias前端 员工管理 条件分页查询: 页面布局 搜索栏: <!-- 搜索栏 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…...
Webrtc编译官方示例实现视频通话
Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子:peerconnection,这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后,我们使用vs打开…...
编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化
编程语言选择分析:C#、Rust、Go 与 TypeScript 编译器优化 在讨论编程语言的选择时,特别是针对微软的 C# 和 Rust,以及谷歌的 Go 语言,以及微软试图通过 Go 来拯救 TypeScript 编译器的问题,我们可以从多个角度来分析和…...
信息学奥赛一本通 1610:玩具装箱 | 洛谷 P3195 [HNOI2008] 玩具装箱
【题目链接】 ybt 1610:玩具装箱 洛谷 P3195 [HNOI2008] 玩具装箱 【题目考点】 1. 动态规划:斜率优化动规 斜率优化动规模板题:信息学奥赛一本通 1607:【 例 2】任务安排 2 | 洛谷 P10979 任务安排 2 【解题思路】 玩具长度…...
数仓工具—Hive语法之不同纬度聚合
不同纬度聚合 提到不同纬度聚合,大家想到的肯定是grouping sets,或者是cube和rollup 其实这些我们之前都讲过,可以看看之前的文章 数仓工具—Hive语法之cube和rollup 数仓工具—Hive语法之grouping sets 但是我们今天遇到的问题是,使用的工具不支持grouping sets,既然…...
领码科技:在低代码技术浪潮中的分享与探索
前言: 25年的职业生涯,赋予了我深厚的技术积累与实践经验。从武汉大学的工测系毕业,到央企副总工的职位,我始终站在IT浪潮的最前沿。然而,离开企业后,我并未停止前行的脚步。从2024年11月起,我选…...
大数据学习(80)-数仓分层
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家
今天忙了一天,很累,准备睡觉的时候,看到网上盛传的刘强东的朋友圈,东哥又在朋友圈发文了。 说实话,看完之后,感动,真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…...
Java 记忆链表,LinkedList 的升级版
文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知,ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构,对应数据结构理论中的数组和链表。但在这两个数据结构,开发者们通常使用 ArrayList,而不使用 LinkedList。JD…...
【构建CV图像识别系统】从传统方法到深度学习
目录 1. 图像的基本概念1.1 像素与色彩1.2 过滤与卷积 2. 图像分类与检测3. 图像特征的提取3.1 全局特征3.2 局部特征3.2.1 边缘(Edge)3.2.2 角点(Corner)3.2.3 SIFT 特征 4. 传统方法与深度学习在图像识别中的应用4.1 基于传统方…...
