【Android Studio开发】生命周期、Activity和组件通信(上)

news2025/5/12 13:42:01

零、前期配置

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">

    <TextView
        android: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 {

    @Override
    protected 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">

    <application
        android: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">
        <activity
            android: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"
    >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World, ActivityLifeCycleActivity!"
        android:textSize="24sp" />

    <Button
        android: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
    @Override
    public 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();
            }
        });
    }

    // 可视生命周期开始时被调用,对用户界面进行必要的更改
    @Override
    public void onStart() {
        super.onStart();
        Log.i(TAG, "(2) onStart()");
    }

    // 在onStart()后被调用,用于恢复onSaveInstanceState()保存的用户界面信息
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        Log.i(TAG, "(3) onRestoreInstanceState()");
    }

    // 在活动生命周期开始时被调用,恢复被onPause()停止的用于界面更新的资源
    @Override
    public void onResume() {
        super.onResume();
        Log.i(TAG, "(4) onResume()");
    }

    // 在活动生命周期结束时被调用,用来保存界面信息
    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        Log.i(TAG, "(5) onSaveInstanceState()");
    }

    // 在重新进入可视生命周期前被调用,载入界面所需要的更改信息
    @Override
    public void onRestart() {
        super.onRestart();
        Log.i(TAG, "(6) onRestart()");
    }

    // 在活动生命周期结束时被调用,用来保存持久的数据。
    @Override
    public void onPause() {
        super.onPause();
        Log.i(TAG, "(7) onPause()");
    }

    // 在可视生命周期结束时被调用,释放或调整 应用对用户不可见时不需要的资源。
    @Override
    public void onStop() {
        super.onStop();
        Log.i(TAG, "(8) onStop()");
    }

    // 在完全生命周期结束时被调用,释放资源,包括线程、数据连接等
    @Override
    public 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">

    <application
        android: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">

        <activity
            android: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

完全生命周期:

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

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

相关文章

【ES】Elasticsearch学习

文章目录 简单的安装 简单的安装 参考&#xff1a;https://blog.csdn.net/smilehappiness/article/details/118466378 官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/targz.html 下载&#xff1a;https://www.elastic.co/cn/downloads/e…

实验三 Python 数据可视化 Python 聚类-K-means(CQUPT)

一、实验目的 Python 数据可视化&#xff1a; 1、学习使用 jieba、wordcloud 等类库生成词云图。 2、学习使用 Matplotlib 库进行数据可视化。 Python 聚类-K-means&#xff1a; 1、理解聚类非监督学习方法的基本原理。 2、掌握 Python、numpy、pandas、sklearn 实现聚类…

【STM32】SPI通信协议W25Q64Flash存储器芯片(学习笔记)

通信接口部分有介绍SPI&#xff1a;【STM32】USART串口协议&串口外设-学习笔记-CSDN博客 SPI通信协议 SPI通信 SPI&#xff08;Serial Peripheral Interface&#xff09;是由Motorola公司开发的一种通用数据总线四根通信线&#xff1a;SCK&#xff08;Serial Clock&…

SpringBoot最佳实践之 - 使用AOP记录操作日志

1. 前言 本篇博客是个人在工作中遇到的需求。针对此需求&#xff0c;开发了具体的实现代码。并不是普适的记录操作日志的方式。以阅读本篇博客的朋友&#xff0c;可以参考此篇博客中记录日志的方式&#xff0c;可能会对你有些许帮助和启发。 2. 需求描述 有一个后台管理系统…

第六届机电一体化技术与智能制造国际学术会议(ICMTIM 2025)

重要信息 4月11-13日 南京江北新区工业大学亚朵酒店 www.icmtim.org&#xff08;点击了解参会投稿等&#xff09; 简介 由南京工业大学主办&#xff0c;南京工业大学电气工程与控制科学学院、中国矿业大学、黑龙江大学、江苏省自动化学会承办的第六届机电一体化技术…

期刊分区表2025年名单下载(经济学、管理学)

2025年期刊分区表包括SCIE、SSCI、A&HCI、ESCI和OAJ&#xff0c;共设置了包括自然科学、社会科学和人文科学在内的21个大类 本次分享的是期刊分区表2025年名单经济学类、管理学类&#xff0c;一共7631025条 一、数据介绍 数据名称&#xff1a;期刊分区表2025年名单 数据…

八股学习-JUC java并发编程

本文仅供个人学习使用&#xff0c;参考资料&#xff1a;JMM&#xff08;Java 内存模型&#xff09;详解 | JavaGuide 线程基础概念 用户线程&#xff1a;由用户空间程序管理和调度的线程&#xff0c;运行在用户空间。 内核线程&#xff1a;由操作系统内核管理和调度的线程&…

PostgreSQL_数据下载并保存(psycopg2)

目录 前置&#xff1a; 1 数据下载 1.1 多个股票多个交易日 1.2 一个交易日所有股票 2 数据保存&#xff0c;使用python中的psycopg2包 2.1 在PyCharm中创建新项目&#xff0c;并安装包 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…

边缘计算革命:重构软件架构的范式与未来

摘要 边缘计算通过将算力下沉至网络边缘&#xff0c;正在颠覆传统中心化软件架构的设计逻辑。本文系统分析了边缘计算对软件架构的范式革新&#xff0c;包括分布式分层架构、实时资源调度、安全防护体系等技术变革&#xff0c;并结合工业物联网、智慧医疗等场景案例&#xff0c…

【读点论文】Chain Replication for Supporting High Throughput and Availability

在分布式系统中&#xff0c;强一致性往往和高可用、高吞吐是矛盾的。比如传统的关系型数据库&#xff0c;其保证了强一致性&#xff0c;但往往牺牲了可用性和吞吐量。而像 NoSQL 数据库&#xff0c;虽然其吞吐量、和扩展性很高&#xff0c;但往往只支持最终一致性&#xff0c;无…

Servlet、Servlet的5个接口方法、生命周期、以及模拟实现 HttpServlet 来写接口的基本原理

DAY15.1 Java核心基础 Servlet Servlet是一个接口&#xff0c;是java的基础&#xff0c;java之所以编写web的程序&#xff0c;接收请求并响应&#xff0c;就是因为Sevlet接口 Java 类实现了Servlet接口的时候就可以接收并响应请求&#xff0c;成为web服务器 Web服务器就是接…

贝叶斯公式的一个直观解释

E E E&#xff1a;抓到娃娃 H H H&#xff1a;坐地铁 H ˉ \bar H Hˉ&#xff1a;坐公交 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)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

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前端 员工管理 条件分页查询&#xff1a; 页面布局 搜索栏&#xff1a; <!-- 搜索栏 --><div class"container"><el-form :inline"true" :model"searchEmp" class"demo-form-inline"><el-form-item label…

Webrtc编译官方示例实现视频通话

Webrtc编译官方示例实现视频通话 前言 webrtc官网demo中给了一个供我们学习和应用webrtc的一个很好的例子&#xff1a;peerconnection&#xff0c;这期我们就来编译和运行下这个程序看看视频通话的效果以。 1、打开源码工程 继上期源码编译完成后&#xff0c;我们使用vs打开…

大数据学习(80)-数仓分层

&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd;支持一…

刘强东突然发声:不该用算法压榨最底层兄弟!东哥,真正的人民企业家

今天忙了一天&#xff0c;很累&#xff0c;准备睡觉的时候&#xff0c;看到网上盛传的刘强东的朋友圈&#xff0c;东哥又在朋友圈发文了。 说实话&#xff0c;看完之后&#xff0c;感动&#xff0c;真的感动。 尤其是当我看到这两句话的时候。 1、我们所学的知识、商业模式、技…

Java 记忆链表,LinkedList 的升级版

文章目录 记忆链表 MemoryLinkedList实战源代码 众所周知&#xff0c;ArrayList 和 LinkedList 是 Java 集合中两个基本的数据结构&#xff0c;对应数据结构理论中的数组和链表。但在这两个数据结构&#xff0c;开发者们通常使用 ArrayList&#xff0c;而不使用 LinkedList。JD…