零、前期配置
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
完全生命周期: