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

零、前期配置

1.【Android】模式

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

右侧是模拟机,显示Hello World

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

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

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

可见布局发生变化:

代码结构也发生变化:


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

一、布局文件activity_main.xml

布局文件,它定义了界面的外观和结构。布局文件是 XML 格式,存放在 res/layout 目录下。以下是一个简单的线性布局示例,包含一个文本视图和一个按钮:

XML 复制代码
<?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 编写,存放在 javakotlin 目录下。以下是使用 Java 编写的一个简单活动示例:

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 复制代码
<?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 复制代码
<?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类,并重写其生命周期回调方法。
java 复制代码
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 复制代码
<?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

完全生命周期:

相关推荐
恋猫de小郭8 小时前
iOS 26 开始强制 UIScene ,你的 Flutter 插件准备好迁移支持了吗?
android·前端·flutter
杨筱毅8 小时前
【底层机制】【Android】【面试】Zygote 为什么使用 Socket 而不是 Binder?
android·1024程序员节·底层机制
快乐1019 小时前
Media3 ExoPlayer扩展FFmpeg音视频解码
android
zgyhc20509 小时前
【Android Audio】安卓音频中Surround mode切换流程
android·音视频
gfdgd xi11 小时前
Wine运行器3.4.0——虚拟机安装工具支持设置UEFI启动
android·windows·python·ubuntu·架构
shaominjin12311 小时前
OpenCV 4.1.2 SDK 静态库作用与功能详解
android·c++·人工智能·opencv·计算机视觉·中间件
东坡肘子12 小时前
Swift 官方发布 Android SDK | 肘子的 Swift 周报 #0108
android·swiftui·swift
Storm-Shadow19 小时前
Android OpenGLES视频剪辑示例源码
android·opengles·视频滤镜
双桥wow19 小时前
android 堆栈打印
android
爱学习的大牛1231 天前
使用C++开发Android .so库的优势与实践指南
android·.so·1024程序员节