Activity 是什么,以及生命周期基础

1. Activity 是什么?

Activity 是 Android 四大组件之一,通常用于承载一个用户界面,是用户和 App 交互的入口。

更准确地说:

Activity 不是 Java 里的 interface。
Activity 是 Android 应用组件,用来管理一个窗口和这段窗口上的用户交互。

一个 App 通常由多个 Activity 或一个 Activity 加多个 Fragment / Compose 页面组成。例如:

登录页
首页
详情页
设置页
支付页

每个 Activity 都由系统管理生命周期。用户打开页面、切换页面、按 Home、进入后台、横竖屏变化、系统内存回收等,都可能触发生命周期变化。


2. Activity 的常见状态

Activity 常见状态可以理解为四类:

状态 含义
Active / Running 普通全屏场景下,Activity 位于前台并可以与用户交互
Paused Activity 失去焦点,可能仍然可见
Stopped Activity 完全不可见,但对象可能仍在内存中
Destroyed / Killed Activity 已销毁,或者所在进程被系统回收

简单记忆:

Running:我正在被操作
Paused:我失去焦点了,但可能还能看见
Stopped:我完全看不见了
Destroyed:我要被销毁了

3. 正常启动生命周期

启动一个 Activity 时,典型流程是:

onCreate()
onStart()
onResume()
方法 含义 常见用途
onCreate() Activity 正在创建 绑定布局、初始化控件、初始化数据
onStart() Activity 变得可见 启动可见时需要的逻辑
onResume() Activity 进入前台状态 恢复交互相关逻辑、开始轻量刷新

示例:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // 初始化控件
    // 初始化数据
    // 设置监听事件
}

4. 按 Home 键进入后台

用户按 Home 键时,Activity 通常会从前台进入后台:

onPause()
onStop()

此时 Activity 不可见,但对象不一定马上销毁。

再次回到这个 Activity,通常走:

onRestart()
onStart()
onResume()

5. 退出 Activity

如果用户按返回键退出当前 Activity,或者代码调用 finish(),一般流程是:

onPause()
onStop()
onDestroy()

可以这样理解:

onPause:暂停前台交互
onStop:完全不可见
onDestroy:准备销毁

6. 每个生命周期方法的作用

onCreate()

表示 Activity 正在被创建。

常见工作:

setContentView()
findViewById / ViewBinding 初始化
初始化 ViewModel / Presenter
读取 Intent 参数
初始化页面数据

onStart()

表示 Activity 已经可见,但不一定能交互。

适合做:

注册可见期间需要的监听
开始一些轻量级可见刷新

onResume()

表示 Activity 进入 Resumed 状态。

普通全屏场景下,onResume() 基本可以理解为页面来到前台、用户可以交互。

但是要注意版本差异:

Android 10 / API 29 之后,多窗口 multi-resume 场景下,
多个 Activity 可以同时处于 RESUMED 状态。
所以 onResume 不一定等价于“当前窗口一定获得焦点”。

如果需要判断 Activity 是否是当前最顶层、最适合独占资源的 Activity,可以关注:

@Override
public void onTopResumedActivityChanged(boolean isTopResumedActivity) {
    super.onTopResumedActivityChanged(isTopResumedActivity);

    if (isTopResumedActivity) {
        // 当前 Activity 是 top resumed
    } else {
        // 当前 Activity 仍可能 resumed,但不是 top resumed
    }
}

onPause()

表示 Activity 正在暂停,通常是前台交互权被其他页面拿走。

常见触发场景:

启动新的 Activity
返回上一个 Activity
弹出透明 Activity
弹出 Dialog 样式 Activity
多窗口中焦点切换到其他 App

onPause() 不适合做耗时操作,因为下一个 Activity 的启动可能要等待当前 Activity 的 onPause() 执行完成。

适合做:

暂停动画
暂停相机预览
保存轻量用户状态
提交轻量埋点

onStop()

表示 Activity 完全不可见。

适合做:

停止不可见时不需要的刷新
释放较重的 UI 资源
取消界面相关监听

核心判断:

onPause 看焦点
onStop 看可见性

只执行 onPause() 不执行 onStop() 的典型情况:

当前 Activity 被透明 Activity 覆盖
当前 Activity 被 Dialog 样式 Activity 覆盖
分屏中仍然可见

onRestart()

表示 Activity 从 Stopped 状态重新回到前台。

典型流程:

onRestart()
onStart()
onResume()

onDestroy()

表示 Activity 即将销毁。

常见触发原因:

用户按返回键退出 Activity
代码调用 finish()
系统配置变化导致 Activity 重建

但是:

onDestroy() 不保证一定执行。
系统直接杀进程时,可能没有机会回调 onDestroy()。

所以不要把关键数据保存只放在 onDestroy() 中。


7. 生命周期记忆口诀

创建:onCreate
可见:onStart
前台:onResume

失焦:onPause
不可见:onStop
销毁:onDestroy

回来:onRestart

更推荐记成:

onPause 看焦点
onStop 看可见性
onDestroy 看销毁,但别依赖它兜底

参考来源