Skip to content

Android - Activity

一个 Activity 代表用户可以执行的一个单一、集中的操作。几乎所有的 Activity 都与用户交互,因此 Activity 类负责为您创建一个窗口,您可以使用 setContentView(View) 将 UI 放置其中。虽然 Activity 通常以全屏窗口的形式呈现给用户,但它们也可以用于其他方式:作为浮动窗口或嵌入到另一个 Activity 中。

对于现代应用,Android Activity 通常是 androidx.appcompat.app.AppCompatActivity 的子类,以提供与旧 Android 版本的兼容性并访问 Material Design 主题等功能。

类似于 C/C++ 或 Java 程序从 main() 函数开始,Android 系统通过调用与 Activity 生命周期阶段相对应的特定回调方法来启动 Activity 实例中的代码。Activity 生命周期是 Activity 从创建到销毁所经历的一系列状态。这些状态包括:

  • 已创建 (Created): onCreate() - Activity 正在创建中。您应该在此处执行应用的基本启动逻辑,这些逻辑在 Activity 的整个生命周期中只应发生一次(例如,创建视图,将数据绑定到列表)。
  • 已启动 (Started): onStart() - Activity 即将对用户可见。
  • 已恢复 (Resumed): onResume() - Activity 现在位于前台并准备好与用户交互。
  • 已暂停 (Paused): onPause() - Activity 部分被遮挡或不再是用户交互的焦点,但仍然可见。在此状态下应释放不应持有的资源(例如相机、传感器)。这通常是用户即将离开您的 Activity 的第一个迹象。
  • 已停止 (Stopped): onStop() - Activity 对用户不再可见。在此处执行更重要、更消耗 CPU 的关闭操作。Activity 可能会被销毁或重新启动。
  • 已销毁 (Destroyed): onDestroy() - Activity 正在被销毁。这可能是因为 Activity 正在完成(通过调用 finish())或系统为了节省空间而临时销毁此 Activity 实例。在此处执行所有资源的最终清理。

此外,当之前停止的 Activity 再次启动时,会调用 onRestart()。

正确理解和实现这些生命周期回调至关重要,以确保您的应用按用户预期运行、高效管理资源并优雅地处理中断(例如来电、屏幕旋转或系统回收资源)。

序号回调方法与描述
1onCreate(Bundle savedInstanceState)
当 Activity 首次创建时调用。您应该在此处执行所有常规静态设置:创建视图、将数据绑定到列表等。如果 Activity 之前有冻结状态,此方法也会为您提供一个包含该状态的 Bundle。
2onStart()
当 Activity 即将对用户可见时调用。如果 Activity 进入前台,随后会调用 onResume();如果 Activity 变为隐藏,随后会调用 onStop()。
3onResume()
当 Activity 将开始与用户交互时调用。此时您的 Activity 位于 Activity 堆栈的顶部,用户输入将送达此处。
4onPause()
当系统即将开始恢复上一个 Activity 时调用。这通常用于将未保存的更改提交到持久数据、停止动画和其他可能消耗 CPU 的操作等。此方法的实现必须非常快速,因为在它返回之前,下一个 Activity 不会恢复。
5onStop()
当 Activity 对用户不再可见时调用。这可能是因为 Activity 正在被销毁,或者因为另一个 Activity(无论是现有的还是新的)已恢复并覆盖了它。如果此 Activity 将返回与用户交互,随后会调用 onRestart();如果此 Activity 将被移除,随后会调用 onDestroy()。
6onRestart()
在您的 Activity 已停止后,再次启动之前调用。之后总是调用 onStart()。
7onDestroy()
在 Activity 被销毁之前调用。这是 Activity 将接收到的最后一次调用。这可能是因为 Activity 正在完成(有人在其上调用了 finish()),或者因为系统为了节省空间而临时销毁此 Activity 实例。您可以使用 isFinishing() 方法区分这两种情况。

此示例演示如何记录 Activity 生命周期事件。在 Android Studio 中使用 Kotlin 或 Java 创建一个新的 Android 项目。

修改您的主 activity 文件(例如 MainActivity.java 或 MainActivity.kt):

// MainActivity.java (using Java)
package com.example.app;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivityLifecycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate() called");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "onStart() called");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume() called");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause() called");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop() called");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart() called");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy() called");
}
}

setContentView(R.layout.activity_main); 这行代码从 res/layout/activity_main.xml 加载 UI 布局。

您的应用中使用的每个 activity 都必须在 AndroidManifest.xml 文件中声明。主 activity(应用的入口点)必须使用包含 MAIN action 和 LAUNCHER category 的 <intent-filter> 进行声明:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.app">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.MyAppTheme">
<activity
android:name=".MainActivity"
android:exported="true"> <!-- Android 12+ 需要此项,如果 activity 有 intent-filter -->
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 在这里声明其他 activity -->
</application>
</manifest>

如果至少有一个 activity 没有声明 MAIN action 或 LAUNCHER category,您的应用图标将不会出现在设备的启动器中。

在模拟器或设备上运行应用。在 Android Studio 中打开 Logcat 窗口(View > Tool Windows > Logcat),并按标签 MainActivityLifecycle(或您选择的标签)进行过滤。应用启动时,您将看到 onCreate()、onStart() 和 onResume() 的日志。

典型的启动时 Logcat 输出:

D/MainActivityLifecycle: onCreate() called
D/MainActivityLifecycle: onStart() called
D/MainActivityLifecycle: onResume() called

现在,尝试以下操作并观察 Logcat 输出:

  • 按下 Home 键: 会调用 onPause()、onStop()。
  • 从最近应用列表重新打开应用: 会调用 onRestart()、onStart()、onResume()。
  • 旋转屏幕(如果开启了自动旋转): Activity 通常会被销毁并重新创建。您会看到 onPause()、onStop()、onDestroy(),然后是 onCreate()、onStart()、onResume()。(要在不完全重新创建的情况下处理旋转等配置更改,或保存状态,您可以使用 onSaveInstanceState(Bundle) 以及可能使用 Jetpack 中的 ViewModels。)
  • 按下返回键: 会调用 onPause()、onStop()、onDestroy(),因为 Activity 正在结束。

理解 activity 生命周期对于构建响应迅速且资源高效的 Android 应用至关重要。为了跨配置更改(如屏幕旋转)和其他生命周期事件管理与 UI 相关的数据,请考虑使用 Android Jetpack 库中的 ViewModel。这有助于将 UI 逻辑与数据处理分离,并防止在生命周期事件期间数据丢失。