01-Activity是什么与生命周期基础
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 看销毁,但别依赖它兜底
参考来源
- 原始 PDF:《01、Activity知识总结.pdf》
- Android 官方文档:Activity 生命周期
https://developer.android.com/guide/components/activities/activity-lifecycle - Android 官方文档:Activity API Reference
https://developer.android.com/reference/android/app/Activity - Android 官方文档:处理配置变更
https://developer.android.com/guide/topics/resources/runtime-changes - Android 官方文档:
<activity>manifest 配置
https://developer.android.com/guide/topics/manifest/activity-element - Android 官方文档:Tasks and back stack
https://developer.android.com/guide/components/activities/tasks-and-back-stack - Android 官方文档:Services overview
https://developer.android.com/develop/background-work/services