ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【Android面试】Activity生命周期专题

【Android面试】Activity生命周期专题 文章目录一、基础核心题1. 请完整说出Activity标准生命周期的所有回调方法以及正常流程下的执行顺序。2. 简述每个生命周期回调方法的触发时机、核心作用以及方法内适合做什么操作、禁止做什么操作。3. onCreate和onStart的核心区别是什么onStart和onResume的核心区别是什么4. onPause和onStop的触发场景有什么不同两个方法的执行耗时有什么限制5. onDestroy方法的触发时机有哪些这个方法里需要注意哪些事项6. Activity正常关闭退出生命周期的执行流程是什么二、场景应用题1. 从Activity A跳转到Activity B完整的生命周期执行顺序是什么如果Activity B是透明主题执行顺序又会发生什么变化2. 从Activity B返回Activity A生命周期的执行流程是什么3. 按下Home键退回桌面再重新打开App回到原Activity生命周期如何执行4. 打开新的对话框样式Activity、悬浮窗原Activity的生命周期会触发哪些方法5. 手机屏幕旋转时Activity的生命周期会如何变化默认情况下会发生什么6. Activity进入分屏模式、悬停模式生命周期会触发哪些回调7.手机熄屏、亮屏当前Activity的生命周期执行顺序是什么8. 启动SingleTask、SingleInstance启动模式的Activity生命周期流程和标准模式有什么差异9. 从Activity A启动带FLAG_ACTIVITY_CLEAR_TOP标记的Activity B生命周期执行顺序是什么10. App在后台被系统回收用户重新点击桌面图标打开App生命周期如何执行11. Activity A启动Activity BB再启动C依次返回A每一步的生命周期调用顺序是什么13. 切换手机语言、切换字体大小、切换深色模式Activity生命周期会发生什么变化14. Activity进入后台后收到推送通知点击打开App回到原页面生命周期调用流程是什么15. 在Activity的onCreate中调用finish()方法生命周期会执行哪些方法顺序是什么16.使用startActivityForResult和registerForActivityResult启动Activity原Activity生命周期调用有区别吗三、异常生命周期题1.什么情况下会触发Activity的异常销毁除了屏幕旋转还有哪些场景2.Activity异常销毁和重建时会触发哪些额外的生命周期回调3. onSaveInstanceState和onRestoreInstanceState的触发时机、作用分别是什么两者和生命周期其他方法的执行顺序是什么4. onSaveInstanceState方法存储的数据除了在onRestoreInstanceState中获取还能在哪里获取5. Activity正常退出销毁会不会触发onSaveInstanceState和onRestoreInstanceState6. 如何防止Activity屏幕旋转时销毁重建有哪些实现方式7. 系统内存不足时Activity被回收的优先级是什么后台Activity一定会被销毁吗四、源码与原理题1. Activity生命周期是由谁控制的简述生命周期的分发流程。2. ActivityThread、ActivityManagerService在生命周期中扮演什么角色3.为什么onPause方法必须执行完毕下一个Activity的onResume才会执行4. onSaveInstanceState的调用时机是在onStop之前还是之后源码层面为什么这么设计5. Activity的状态在源码中是如何标记和维护的6. 谈谈你对生命周期感知能力的理解系统是如何实现生命周期监听的五、实战优化与避坑题1. 在生命周期方法中执行耗时操作会引发什么问题哪些生命周期方法严禁做耗时操作2. Activity重建时如何恢复页面数据和状态有哪些注意事项3. 生命周期中注册广播、绑定服务、初始化控件对应的解绑、释放操作应该放在哪个生命周期为什么4. 如何避免Activity生命周期导致的内存泄漏举几个常见的内存泄漏场景。5. 多个Activity嵌套跳转如何管理生命周期避免出现页面状态异常6. Jetpack组件如ViewModel、Lifecycle是如何和Activity生命周期结合的解决了什么问题7. 如果Activity在onPause或者onStop时被系统杀死重启后该如何处理*六、综合拓展题压轴考察深度1. 对比Activity生命周期和Fragment生命周期两者的关联和区别是什么2. 说说你对Activity四种启动模式对生命周期影响的理解 *3.如果屏蔽Activity的生命周期回调会出现什么问题有哪些实现方式4. 在组件化、插件化开发中Activity生命周期管理需要注意哪些问题5. 前台Activity和后台Activity在生命周期、内存优先级、系统回收机制上有什么不同6. ActivityThread 的 H 是什么7. 为什么 AMS 不能直接调用 Activity 方法一、基础核心题1. 请完整说出Activity标准生命周期的所有回调方法以及正常流程下的执行顺序。答案标准生命周期七大回调方法onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()。正常启动流程onCreate → onStart → onResume。正常退出销毁流程onPause → onStop → onDestroy。2. 简述每个生命周期回调方法的触发时机、核心作用以及方法内适合做什么操作、禁止做什么操作。答案onCreate()Activity创建时触发只调用一次。核心作用是初始化布局、控件、变量、数据绑定、组件注册。适合setContentView、初始化控件、注册广播、绑定服务。禁止执行耗时操作、大量网络请求、循环阻塞。onStart()Activity可见但未获取焦点无法交互。核心作用是页面可见前的准备。适合注册监听、加载轻量数据。禁止耗时操作。90% 的 APP 几乎不在这写逻辑onResume()Activity获取焦点可交互处于前台运行状态。适合刷新页面、恢复动画、开启定时任务。禁止耗时操作、阻塞操作。每次回到页面都要刷新的数据onPause()Activity失去焦点仍可见。核心作用是暂停操作、保存临时数据。适合暂停动画、暂停视频、保存轻量数据、释放独占资源。禁止耗时操作系统限制超时会导致ANR。onStop()Activity完全不可见。适合停止动画、释放资源、停止定时任务、保存持久化数据。onDestroy()Activity销毁时触发只调用一次。适合解绑服务、注销广播、反注册监听、释放内存、防止内存泄漏。onRestart()Activity从不可见重新变为可见时触发如Home键返回。适合恢复页面状态、重新加载数据。3. onCreate和onStart的核心区别是什么onStart和onResume的核心区别是什么答案onCreate与onStartonCreate是Activity首次创建时调用全局只走一次侧重初始化onStart是Activity变为可见时调用可多次调用如从后台返回侧重页面展示准备。onStart与onResumeonStart时Activity可见但不可交互未获取焦点onResume时Activity可见且可交互拿到焦点处于前台运行状态。4. onPause和onStop的触发场景有什么不同两个方法的执行耗时有什么限制答案触发场景差异onPauseActivity失去焦点但仍部分/全部可见如跳转透明Activity、弹出Dialog样式Activity。onStopActivity完全被遮挡彻底不可见如跳转普通全屏Activity、按Home键退后台。耗时限制onPause有严格耗时限制系统规定执行时长不能超过500ms超时会触发ANR且必须等onPause执行完下一个Activity才能执行onResumeonStop耗时限制宽松可做稍重操作但依然不建议耗时太久。5. onDestroy方法的触发时机有哪些这个方法里需要注意哪些事项答案触发时机1. 主动调用finish()关闭Activity2. 系统内存不足回收页面3. 配置变更旋转屏幕、切换语言导致重建销毁4. 用户手动划掉后台进程。注意事项必须在该方法内完成资源释放比如解绑服务、注销广播接收器、反注册事件监听、关闭线程、清空静态引用、释放Bitmap等严防内存泄漏禁止在onDestroy里执行耗时操作和异步任务。6. Activity正常关闭退出生命周期的执行流程是什么答案当前Activity执行onPause() → onStop() → onDestroy()。如果是从A关闭返回B额外加上B的生命周期A.onPause → B.onRestart → B.onStart → B.onResume → A.onStop → A.onDestroy。二、场景应用题1. 从Activity A跳转到Activity B完整的生命周期执行顺序是什么如果Activity B是透明主题执行顺序又会发生什么变化答案普通全屏BA.onPause → B.onCreate → B.onStart → B.onResume → A.onStop。透明主题BA.onPause → B.onCreate → B.onStart → B.onResumeA不会执行onStop因为A始终可见。2. 从Activity B返回Activity A生命周期的执行流程是什么答案B.onPause → A.onRestart → A.onStart → A.onResume → B.onStop → B.onDestroy。3. 按下Home键退回桌面再重新打开App回到原Activity生命周期如何执行答案按Home键当前Activity.onPause → onStop。重新打开Activity.onRestart → onStart → onResume。4. 打开新的对话框样式Activity、悬浮窗原Activity的生命周期会触发哪些方法答案打开Dialog样式Activity原Activity只执行onPause不执行onStop因为原页面依然可见打开系统悬浮窗/普通全局Dialog原Activity生命周期无任何回调因为未触发Activity焦点切换。5. 手机屏幕旋转时Activity的生命周期会如何变化默认情况下会发生什么答案默认情况下屏幕旋转会触发Activity销毁重建生命周期顺序onPause → onStop → onDestroy → onCreate → onStart → onResume过程中会触发onSaveInstanceState保存数据和onRestoreInstanceState恢复数据禁止重建android:configChanges“orientation|screenSize|keyboardHidden”Overridepublic void onConfigurationChanged(Configuration newConfig) {super.onConfigurationChanged(newConfig);// 自己手动处理横竖屏UI适配、布局切换}6. Activity进入分屏模式、悬停模式生命周期会触发哪些回调答案进入分屏/悬停模式Activity执行onPause → onStop onStop不一定会执行)退出分屏/悬停恢复全屏Activity执行onRestart → onStart → onResume分屏状态下失去焦点切换到另一个App仅执行onPause不执行onStop。7.手机熄屏、亮屏当前Activity的生命周期执行顺序是什么答案熄屏Activity.onPause → onStop。亮屏解锁Activity.onRestart → onStart → onResume。8. 启动SingleTask、SingleInstance启动模式的Activity生命周期流程和标准模式有什么差异答案SingleTask如果栈内已有实例不会创建新实例会清空栈内上方Activity回调已存在实例的onNewIntent再执行onRestart→onStart→onResume无实例则正常走创建流程。SingleInstance单独占用一个任务栈首次启动正常创建后续启动复用实例回调onNewIntent生命周期和SingleTask类似不会重复创建。标准模式每次启动都创建新实例执行完整的onCreate→onStart→onResume。9. 从Activity A启动带FLAG_ACTIVITY_CLEAR_TOP标记的Activity B生命周期执行顺序是什么答案分两种情况B已在栈内A.onPause → B.onNewIntent → B.onRestart → B.onStart → B.onResume → A.onStop → A.onDestroy。B不在栈内A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop。10. App在后台被系统回收用户重新点击桌面图标打开App生命周期如何执行答案不会执行onRestart会重新走完整的创建流程onCreate → onStart → onResume可通过onCreate里的savedInstanceState参数判断是否为重建恢复。11. Activity A启动Activity BB再启动C依次返回A每一步的生命周期调用顺序是什么A→BA.onPause → B.onCreate → B.onStart → B.onResume → A.onStop。B→CB.onPause → C.onCreate → C.onStart → C.onResume → B.onStop。C→BC.onPause → B.onRestart → B.onStart → B.onResume → C.onStop → C.onDestroy。B→AB.onPause → A.onRestart → A.onStart → A.onResume → B.onStop → B.onDestroy。13. 切换手机语言、切换字体大小、切换深色模式Activity生命周期会发生什么变化答案和屏幕旋转一致默认会触发Activity销毁重建执行顺序onPause → onSaveInstanceState → onStop → onDestroy → onCreate → onRestoreInstanceState → onStart → onResume。14. Activity进入后台后收到推送通知点击打开App回到原页面生命周期调用流程是什么答案如果Activity未被回收onRestart → onStart → onResume。如果Activity被系统回收重新执行onCreate → onStart → onResume。15. 在Activity的onCreate中调用finish()方法生命周期会执行哪些方法顺序是什么答案onCreate → finish() → onDestroy不会执行onStart和onResume页面创建后立刻销毁。16.使用startActivityForResult和registerForActivityResult启动Activity原Activity生命周期调用有区别吗答案生命周期流程完全一致没有区别。两者只是结果回调方式不同不会影响生命周期的执行顺序和触发时机。三、异常生命周期题1.什么情况下会触发Activity的异常销毁除了屏幕旋转还有哪些场景答案异常销毁指系统因配置变化或资源紧张主动销毁Activity非用户主动关闭。常见场景1. 屏幕旋转、切换分辨率2. 切换系统语言、字体、主题、深色模式3. 系统内存不足回收后台Activity4. 权限变更5. 输入法切换导致配置改变。2.Activity异常销毁和重建时会触发哪些额外的生命周期回调答案会触发两个额外方法onSaveInstanceState(Bundle outState)销毁前保存页面数据。onRestoreInstanceState(Bundle savedInstanceState)重建时恢复数据也可在onCreate中恢复。3. onSaveInstanceState和onRestoreInstanceState的触发时机、作用分别是什么两者和生命周期其他方法的执行顺序是什么答案触发时机与作用onSaveInstanceState异常销毁前触发正常销毁不触发作用是保存页面临时数据如输入框内容、滚动位置。onRestoreInstanceState重建时触发作用是恢复onSaveInstanceState保存的数据。执行顺序异常销毁onPause → onSaveInstanceState → onStop → onDestroy。重建onCreate → onRestoreInstanceState → onStart → onResume。4. onSaveInstanceState方法存储的数据除了在onRestoreInstanceState中获取还能在哪里获取答案还可以在onCreate(Bundle savedInstanceState)中获取通过判断savedInstanceState是否为null来区分是首次创建还是重建。5. Activity正常退出销毁会不会触发onSaveInstanceState和onRestoreInstanceState答案不会。这两个方法只在Activity异常销毁、需要重建时才触发用户主动调用finish()、返回键关闭页面属于正常销毁不会触发。6. 如何防止Activity屏幕旋转时销毁重建有哪些实现方式答案常用两种方式清单文件配置在Activity标签添加android:configChanges“orientation|screenSize|keyboardHidden”拦截配置变更不重建回调onConfigurationChanged。代码处理监听旋转事件手动处理布局不依赖系统重建。7. 系统内存不足时Activity被回收的优先级是什么后台Activity一定会被销毁吗答案回收优先级从高到低空进程无Activity 后台进程不可见Activity 服务进程 前台进程可见Activity。后台Activity不一定被销毁系统会按优先级回收只有内存极度紧张时才会销毁后台Activity。四、源码与原理题1. Activity生命周期是由谁控制的简述生命周期的分发流程。答案生命周期由AMSActivityManagerService和ActivityThread主线程共同控制。分发流程AMS决策Activity状态 → 通过Binder通信通知ApplicationThread → ActivityThread接收消息 → 调用HHandler切换主线程 → 反射调用Activity对应的生命周期方法。2. ActivityThread、ActivityManagerService在生命周期中扮演什么角色答案AMS系统服务负责管理所有App的Activity生命周期、任务栈、进程优先级做决策和调度。ActivityThreadApp的主线程类管理App内所有Activity接收AMS指令执行生命周期回调处理页面创建、销毁等逻辑。3.为什么onPause方法必须执行完毕下一个Activity的onResume才会执行答案系统源码层面做了同步阻塞设计为了保证页面切换的连贯性防止两个Activity同时处于前台交互状态避免界面错乱和数据冲突。onPause是原子操作必须执行完成AMS才会下发下一个Activity的onResume指令。4. onSaveInstanceState的调用时机是在onStop之前还是之后源码层面为什么这么设计答案在onStop之前调用。源码设计原因保证页面停止前数据已经完成保存防止onStop执行过程中Activity被突然杀死导致数据丢失。5. Activity的状态在源码中是如何标记和维护的答案源码中通过Activity的成员变量mActivityInfo、mState维护状态AMS端用ActivityRecord记录每个Activity的状态初始化、可见、前台、销毁等通过枚举值标记生命周期阶段ActivityThread同步维护状态保证两端状态一致。6. 谈谈你对生命周期感知能力的理解系统是如何实现生命周期监听的答案生命周期感知指组件能感知Activity/Fragment的生命周期变化自动做适配操作如Jetpack Lifecycle。实现原理通过ReportFragment无界面空白Fragment注入到Activity监听Activity生命周期并分发利用观察者模式注册观察者生命周期变化时通知所有注册对象。五、实战优化与避坑题1. 在生命周期方法中执行耗时操作会引发什么问题哪些生命周期方法严禁做耗时操作答案引发问题ANR应用无响应、页面卡顿、启动慢、生命周期阻塞。严禁耗时操作的方法onCreate、onStart、onResume、onPause尤其是onPause超时直接触发ANR。2. Activity重建时如何恢复页面数据和状态有哪些注意事项答案恢复方式1. 重写onSaveInstanceState保存数据2. 在onCreate或onRestoreInstanceState中取出数据恢复。注意事项仅保存轻量数据禁止存大量数据和Bitmap区分正常创建和重建判断savedInstanceState是否为空配合ViewModel使用数据保存更稳定。3. 生命周期中注册广播、绑定服务、初始化控件对应的解绑、释放操作应该放在哪个生命周期为什么答案注册/绑定放在onCreate只执行一次解绑/释放放在onDestroy防止多次注册临时注册监听可放在onStart解绑放在onStop核心原因配对执行避免漏解绑导致内存泄漏、资源浪费、重复注册。4. 如何避免Activity生命周期导致的内存泄漏举几个常见的内存泄漏场景。答案常见泄漏场景单例持有Activity引用、非静态内部类/匿名内部类Handler、线程、未注销广播/监听、资源未关闭Cursor、流、Bitmap未回收。避免方式用弱引用、静态内部类Handler.removeCallbacks及时注销组件onDestroy释放所有引用使用LeakCanary检测。5. 多个Activity嵌套跳转如何管理生命周期避免出现页面状态异常答案1. 合理设置启动模式防止栈混乱2. 避免在onPause/onStop做耗时操作3. 状态保存与恢复到位4. 关闭不需要的Activity5. 用Lifecycle感知生命周期统一管理资源。6. Jetpack组件如ViewModel、Lifecycle是如何和Activity生命周期结合的解决了什么问题答案Lifecycle通过观察者模式无感监听生命周期自动处理资源启停。ViewModel独立于生命周期Activity重建时数据不丢失生命周期销毁时自动清理数据。解决问题防止内存泄漏、数据丢失、生命周期代码冗余、页面状态异常。7. 如果Activity在onPause或者onStop时被系统杀死重启后该如何处理*答案1. 利用onSaveInstanceState保存关键数据2. 重启后在onCreate恢复数据3. 检查页面状态重新加载数据4. 恢复用户操作现场提升体验5. 避免强依赖前台状态做好容错处理。六、综合拓展题压轴考察深度1. 对比Activity生命周期和Fragment生命周期两者的关联和区别是什么答案关联Fragment生命周期依赖Activity跟随Activity触发如Activity.onPause→Fragment.onPause。区别Fragment有独立生命周期onAttach、onCreateView、onDestroyView可动态添加/移除Activity是页面载体生命周期更完整Fragment生命周期更细侧重视图管理。2. 说说你对Activity四种启动模式对生命周期影响的理解 *答案standard每次启动新建实例完整生命周期。singleTop栈顶复用不新建回调onNewIntent。singleTask栈内复用清空上方Activity回调onNewIntent。singleInstance单实例栈复用回调onNewIntent。核心影响standard会频繁创建销毁其他模式复用实例减少生命周期调用节省内存。3.如果屏蔽Activity的生命周期回调会出现什么问题有哪些实现方式答案出现问题资源无法释放、内存泄漏、页面不显示、数据不保存、ANR、应用崩溃。实现方式重写生命周期方法不调用super反射拦截生命周期调用篡改AMS调度逻辑系统级操作。4. 在组件化、插件化开发中Activity生命周期管理需要注意哪些问题答案1. 跨组件跳转生命周期同步2. 插件Activity生命周期代理3. 防止资源泄漏4. 栈管理统一5. 重建恢复适配6. 生命周期监听分发正常。5. 前台Activity和后台Activity在生命周期、内存优先级、系统回收机制上有什么不同答案生命周期前台处于onResume可交互后台处于onStop不可见。内存优先级前台优先级极高后台优先级低。回收机制前台几乎不回收后台按内存紧张程度回收。6. ActivityThread 的 H 是什么H 是ActivityThread内部定义的继承自 Handler 的静态内部类绑定应用主线程的 Looper。AMS 通过 Binder 跨进程发送的四大组件生命周期指令Activity 启动、pause、stop、destroy 等都会封装成 Message投递到 H 这个 Handler。H 在主线程收到消息后执行对应的逻辑反射调用 Activity 的生命周期回调onCreate/onPause 等。一句话H 就是应用主线程专门用来接收 AMS 跨进程指令、调度 Activity 生命周期的 Handler。7. 为什么 AMS 不能直接调用 Activity 方法进程隔离AMS 跑在 system_server 系统进程Activity 实例存在于 App 应用进程。两个进程地址空间相互独立AMS 根本拿不到 App 进程里 Activity 对象的引用无法直接调用对象方法。线程安全 主线程约束Activity 生命周期必须在 App主线程执行。AMS 的 Binder 线程是系统的 binder 工作线程如果直接调用会在非主线程执行 UI 相关回调引发异常。消息串行化AMS 把指令发给 ActivityThread 的 H主线程 Handler所有生命周期任务进入消息队列串行执行保证生命周期顺序不乱。AMS 无法保证调用时序。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进