安卓白话文面试(5) —— Activity生命周期?人的一生

0 阅读4分钟

你有没有参加过同学聚会? 从收到邀请、出门赴约、在饭桌上嗨聊、中途去接个电话、到最后散场回家——这一趟流程,几乎就是 Activity 的一生。今天咱们就用“人”的视角,把安卓四大组件之首的 Activity 生命周期彻底聊明白。

1. 出生与初始化:onCreate —— 你刚来到这个世界

每个人出生时,爸妈会给你准备衣服、起名字、办出生证明。onCreate 就是 Activity 的“出生”时刻。在这里,你做最基础的初始化:setContentView 加载布局、找控件、绑定数据。

最佳实践:别在 onCreate 里做耗时操作。打个比方:产房还没收拾好就让你表演节目,界面会卡白屏。耗时任务交给协程或 ViewModel。

2. 可见但无焦点:onStart → onResume —— 你走进餐厅,还没坐下

你推门进了餐厅,服务员看到你了(可见),但你还没入座点菜(不能交互)。onStart 就是可见状态,注意:它不是“后台”——后台是完全看不见的意思。
紧接着 onResume 调用,你坐下了,菜单拿到手,可以点菜了——用户终于能点击按钮、滑动屏幕

3. 被部分遮挡:onPause —— 接了个电话,暂停聊天

你正和朋友碰杯,突然来了个透明的小窗(比如分屏模式、画中画),你还能瞄到聚会现场,但暂时不能操作了。onPause 就是这种“部分可见、不可交互”的状态。

注意:普通的 AlertDialog 不会触发 onPause,只有被另一个 Activity(可能是透明主题)部分覆盖,或者进入多窗口模式才会。
最佳实践:onPause 必须轻量(<几百毫秒),因为系统要等它跑完才切换页面。适合注销传感器、停止动画,千万别做磁盘写入。

4. 完全看不见:onStop —— 你走出餐厅,去逛商场

接完电话你觉得没意思,直接离开了餐厅。此时餐厅里的人看不到你了(完全不可见)。onStop 对应 Activity 被全屏页面覆盖,或按 Home 键退到桌面。释放重资源的好时机:暂停视频播放、释放相机。

5. 重新回来:onRestart → onStart —— 你忘了拿包,又折返

你走出餐厅十米,突然想起包还挂在椅子上。于是你转身回去,再次推开门——这个过程就是 onRestart。它不会走 onCreate,因为你的“出生证”还在。

6. 紧急备份:onSaveInstanceState —— 服务员帮你收好了包

当你旋转屏幕或系统内存紧张时,你的 Activity 会被销毁重建。但系统会在销毁前调用 onSaveInstanceState,让你把用户输入的文本、滚动位置等存进 Bundle。下次 onCreateonRestoreInstanceState 就能取回,就像服务员在你离席时帮你保管了遗忘的包。

7. 死亡:onDestroy —— 生命终结

聚会结束,餐厅打烊,你彻底回家并注销了今晚的身份。onDestroy 要么是你主动 finish(),要么是系统杀进程。在这里解绑广播、关闭 Cursor,善始善终。

💡 现代开发小贴士

现在更推荐用 ViewModel 存页面数据,它不会因为屏幕旋转而销毁,比 onSaveInstanceState 更方便。配合 Lifecycle 组件,你可以写一个 LifecycleObserver 自动响应生命周期,避免在 Activity 里塞一堆回调代码。


总结表格(生命周期速查)

场景经历的方法比喻
首次启动onCreate → onStart → onResume出生 → 可见 → 坐下点菜
按 Home 键onPause → onStop部分可见 → 完全不可见
从桌面返回onRestart → onStart → onResume折返 → 再可见 → 再交互
打开新全屏页面onPause → onStop被完全覆盖
从全屏页返回onRestart → onStart → onResume同折返
旋转屏幕(默认)onPause → onStop → onDestroy → onCreate...销毁重建,但数据通过 onSaveInstanceState 找回
退出或被杀onPause → onStop → onDestroy起身 → 离场 → 注销

面试官爱怎么问?

问:Activity A 启动 Activity B,两者生命周期的执行顺序?
答:A 的 onPause → B 的 onCreate/onStart/onResume → A 的 onStop
补充:如果 B 是透明主题,A 的 onStop 不会被调用,因为 A 依然部分可见。

问:配置更改(旋转屏幕)时,怎么避免 Activity 重建?
答:可以在清单文件配 android:configChanges="orientation|screenSize",这样只会回调 onConfigurationChanged,不会走销毁流程。但不推荐作为常规方案——现代开发更建议用 ViewModel 保存数据,让系统正常重建,反而更稳定。

人话总结

Activity 的一生就是“出生 → 可见 → 获得焦点 → 被遮挡 → 完全隐藏 → 死亡”,别忘了系统会在杀你之前让你存一次档(onSaveInstanceState)。


汇总导航

安卓白话文面试导航