文章目录
- 一、基础核心题(必问,考察基本功)
-
- [1. 请完整说出Activity标准生命周期的所有回调方法,以及正常流程下的执行顺序。](#1. 请完整说出Activity标准生命周期的所有回调方法,以及正常流程下的执行顺序。)
- [2. 简述每个生命周期回调方法的触发时机、核心作用,以及方法内适合做什么操作、禁止做什么操作。](#2. 简述每个生命周期回调方法的触发时机、核心作用,以及方法内适合做什么操作、禁止做什么操作。)
- [3. onCreate和onStart的核心区别是什么?onStart和onResume的核心区别是什么?](#3. onCreate和onStart的核心区别是什么?onStart和onResume的核心区别是什么?)
- [4. onPause和onStop的触发场景有什么不同?两个方法的执行耗时有什么限制?](#4. onPause和onStop的触发场景有什么不同?两个方法的执行耗时有什么限制?)
- [5. onDestroy方法的触发时机有哪些?这个方法里需要注意哪些事项?](#5. onDestroy方法的触发时机有哪些?这个方法里需要注意哪些事项?)
- [6. Activity正常关闭退出,生命周期的执行流程是什么?](#6. Activity正常关闭退出,生命周期的执行流程是什么?)
- 二、场景应用题(高频,考察实战理解)
-
- [1. 从Activity A跳转到Activity B,完整的生命周期执行顺序是什么?如果Activity B是透明主题,执行顺序又会发生什么变化?](#1. 从Activity A跳转到Activity B,完整的生命周期执行顺序是什么?如果Activity B是透明主题,执行顺序又会发生什么变化?)
- [2. 从Activity B返回Activity A,生命周期的执行流程是什么?](#2. 从Activity B返回Activity A,生命周期的执行流程是什么?)
- [3. 按下Home键退回桌面,再重新打开App回到原Activity,生命周期如何执行?](#3. 按下Home键退回桌面,再重新打开App回到原Activity,生命周期如何执行?)
- [4. 打开新的对话框样式Activity、悬浮窗,原Activity的生命周期会触发哪些方法?](#4. 打开新的对话框样式Activity、悬浮窗,原Activity的生命周期会触发哪些方法?)
- [5. 手机屏幕旋转时,Activity的生命周期会如何变化?默认情况下会发生什么?](#5. 手机屏幕旋转时,Activity的生命周期会如何变化?默认情况下会发生什么?)
- [6. Activity进入分屏模式、悬停模式,生命周期会触发哪些回调?*](#6. Activity进入分屏模式、悬停模式,生命周期会触发哪些回调?*)
- 7.手机熄屏、亮屏,当前Activity的生命周期执行顺序是什么?*
- [8. 启动SingleTask、SingleInstance启动模式的Activity,生命周期流程和标准模式有什么差异?*](#8. 启动SingleTask、SingleInstance启动模式的Activity,生命周期流程和标准模式有什么差异?*)
- 9.在Activity中弹出全局Dialog(非Activity样式),当前Activity生命周期会不会触发回调?为什么?
- [10. 从Activity A启动带FLAG_ACTIVITY_CLEAR_TOP标记的Activity B,生命周期执行顺序是什么?](#10. 从Activity A启动带FLAG_ACTIVITY_CLEAR_TOP标记的Activity B,生命周期执行顺序是什么?)
- [11. App在后台被系统回收,用户重新点击桌面图标打开App,生命周期如何执行?](#11. App在后台被系统回收,用户重新点击桌面图标打开App,生命周期如何执行?)
- [12. Activity A启动Activity B,B再启动C,依次返回A,每一步的生命周期调用顺序是什么?](#12. Activity A启动Activity B,B再启动C,依次返回A,每一步的生命周期调用顺序是什么?)
- [13. 切换手机语言、切换字体大小、切换深色模式,Activity生命周期会发生什么变化?](#13. 切换手机语言、切换字体大小、切换深色模式,Activity生命周期会发生什么变化?)
- [14. Activity进入后台后,收到推送通知点击打开App,回到原页面,生命周期调用流程是什么?](#14. Activity进入后台后,收到推送通知点击打开App,回到原页面,生命周期调用流程是什么?)
- [15. 在Activity的onCreate中调用finish()方法,生命周期会执行哪些方法?顺序是什么?](#15. 在Activity的onCreate中调用finish()方法,生命周期会执行哪些方法?顺序是什么?)
- 16.使用startActivityForResult和registerForActivityResult启动Activity,原Activity生命周期调用有区别吗?
- 三、异常生命周期题(进阶,大厂重点)
-
- 1.什么情况下会触发Activity的异常销毁?除了屏幕旋转,还有哪些场景?*
- 2.Activity异常销毁和重建时,会触发哪些额外的生命周期回调?*
- [3. onSaveInstanceState和onRestoreInstanceState的触发时机、作用分别是什么?两者和生命周期其他方法的执行顺序是什么?*](#3. onSaveInstanceState和onRestoreInstanceState的触发时机、作用分别是什么?两者和生命周期其他方法的执行顺序是什么?*)
- [4. onSaveInstanceState方法存储的数据,除了在onRestoreInstanceState中获取,还能在哪里获取?](#4. onSaveInstanceState方法存储的数据,除了在onRestoreInstanceState中获取,还能在哪里获取?)
- [5. Activity正常退出销毁,会不会触发onSaveInstanceState和onRestoreInstanceState?](#5. Activity正常退出销毁,会不会触发onSaveInstanceState和onRestoreInstanceState?)
- [6. 如何防止Activity屏幕旋转时销毁重建?有哪些实现方式?](#6. 如何防止Activity屏幕旋转时销毁重建?有哪些实现方式?)
- [7. 系统内存不足时,Activity被回收的优先级是什么?后台Activity一定会被销毁吗?](#7. 系统内存不足时,Activity被回收的优先级是什么?后台Activity一定会被销毁吗?)
- 四、源码与原理题(高级,深挖底层)
-
- [1. Activity生命周期是由谁控制的?简述生命周期的分发流程。*](#1. Activity生命周期是由谁控制的?简述生命周期的分发流程。*)
- [2. ActivityThread、ActivityManagerService在生命周期中扮演什么角色?*](#2. ActivityThread、ActivityManagerService在生命周期中扮演什么角色?*)
- 3.为什么onPause方法必须执行完毕,下一个Activity的onResume才会执行?
- [4. onSaveInstanceState的调用时机是在onStop之前还是之后?源码层面为什么这么设计?](#4. onSaveInstanceState的调用时机是在onStop之前还是之后?源码层面为什么这么设计?)
- [5. Activity的状态在源码中是如何标记和维护的?](#5. Activity的状态在源码中是如何标记和维护的?)
- [6. 谈谈你对生命周期感知能力的理解,系统是如何实现生命周期监听的?](#6. 谈谈你对生命周期感知能力的理解,系统是如何实现生命周期监听的?)
- 五、实战优化与避坑题(大厂必考,贴合工作)
-
- [1. 在生命周期方法中执行耗时操作会引发什么问题?哪些生命周期方法严禁做耗时操作?](#1. 在生命周期方法中执行耗时操作会引发什么问题?哪些生命周期方法严禁做耗时操作?)
- [2. Activity重建时,如何恢复页面数据和状态?有哪些注意事项?](#2. Activity重建时,如何恢复页面数据和状态?有哪些注意事项?)
- [3. 生命周期中注册广播、绑定服务、初始化控件,对应的解绑、释放操作应该放在哪个生命周期?为什么?](#3. 生命周期中注册广播、绑定服务、初始化控件,对应的解绑、释放操作应该放在哪个生命周期?为什么?)
- [4. 如何避免Activity生命周期导致的内存泄漏?举几个常见的内存泄漏场景。](#4. 如何避免Activity生命周期导致的内存泄漏?举几个常见的内存泄漏场景。)
- [5. 多个Activity嵌套跳转,如何管理生命周期,避免出现页面状态异常?](#5. 多个Activity嵌套跳转,如何管理生命周期,避免出现页面状态异常?)
- [6. Jetpack组件(如ViewModel、Lifecycle)是如何和Activity生命周期结合的?解决了什么问题?](#6. Jetpack组件(如ViewModel、Lifecycle)是如何和Activity生命周期结合的?解决了什么问题?)
- [7. 如果Activity在onPause或者onStop时被系统杀死,重启后该如何处理?*](#7. 如果Activity在onPause或者onStop时被系统杀死,重启后该如何处理?*)
- 六、综合拓展题(压轴,考察深度)
-
- [1. 对比Activity生命周期和Fragment生命周期,两者的关联和区别是什么?](#1. 对比Activity生命周期和Fragment生命周期,两者的关联和区别是什么?)
- [2. 说说你对Activity四种启动模式对生命周期影响的理解 *](#2. 说说你对Activity四种启动模式对生命周期影响的理解 *)
- 3.如果屏蔽Activity的生命周期回调,会出现什么问题?有哪些实现方式?
- [4. 在组件化、插件化开发中,Activity生命周期管理需要注意哪些问题?](#4. 在组件化、插件化开发中,Activity生命周期管理需要注意哪些问题?)
- [5. 前台Activity和后台Activity,在生命周期、内存优先级、系统回收机制上有什么不同?](#5. 前台Activity和后台Activity,在生命周期、内存优先级、系统回收机制上有什么不同?)
一、基础核心题(必问,考察基本功)
1. 请完整说出Activity标准生命周期的所有回调方法,以及正常流程下的执行顺序。
答案:标准生命周期七大回调方法:onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy()。
正常启动流程:onCreate → onStart → onResume。
正常退出销毁流程:onPause → onStop → onDestroy。
2. 简述每个生命周期回调方法的触发时机、核心作用,以及方法内适合做什么操作、禁止做什么操作。
答案:
- onCreate():Activity创建时触发,只调用一次。核心作用是初始化布局、控件、变量、数据绑定、组件注册。适合:setContentView、初始化控件、注册广播、绑定服务。禁止:执行耗时操作、大量网络请求、循环阻塞。
- onStart():Activity可见但未获取焦点,无法交互。核心作用是页面可见前的准备。适合:注册监听、加载轻量数据。禁止:耗时操作。
- onResume():Activity获取焦点,可交互,处于前台运行状态。适合:刷新页面、恢复动画、开启定时任务。禁止:耗时操作、阻塞操作。
- onPause():Activity失去焦点,仍可见。核心作用是暂停操作、保存临时数据。适合:暂停动画、暂停视频、保存轻量数据、释放独占资源。禁止:耗时操作(系统限制超时,会导致ANR)。
- onStop():Activity完全不可见。适合:停止动画、释放资源、停止定时任务、保存持久化数据。
- onDestroy():Activity销毁时触发,只调用一次。适合:解绑服务、注销广播、反注册监听、释放内存、防止内存泄漏。
- onRestart():Activity从不可见重新变为可见时触发(如Home键返回)。适合:恢复页面状态、重新加载数据。
3. onCreate和onStart的核心区别是什么?onStart和onResume的核心区别是什么?
答案:
- onCreate与onStart:onCreate是Activity首次创建时调用,全局只走一次,侧重初始化;onStart是Activity变为可见时调用,可多次调用(如从后台返回),侧重页面展示准备。
- onStart与onResume:onStart时Activity可见但不可交互,未获取焦点;onResume时Activity可见且可交互,拿到焦点,处于前台运行状态。
4. onPause和onStop的触发场景有什么不同?两个方法的执行耗时有什么限制?
答案:
触发场景差异:
- onPause:Activity失去焦点,但仍部分/全部可见(如跳转透明Activity、弹出Dialog样式Activity)。
- onStop:Activity完全被遮挡,彻底不可见(如跳转普通全屏Activity、按Home键退后台)。
耗时限制:onPause有严格耗时限制,系统规定执行时长不能超过500ms,超时会触发ANR,且必须等onPause执行完,下一个Activity才能执行onResume;onStop耗时限制宽松,可做稍重操作,但依然不建议耗时太久。
5. onDestroy方法的触发时机有哪些?这个方法里需要注意哪些事项?
答案:
触发时机 :1. 主动调用finish()关闭Activity;2. 系统内存不足回收页面;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是透明主题,执行顺序又会发生什么变化?
答案:
普通全屏B:A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop。
透明主题B:A.onPause → B.onCreate → B.onStart → B.onResume;A不会执行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(恢复数据)。
6. Activity进入分屏模式、悬停模式,生命周期会触发哪些回调?*
答案:进入分屏/悬停模式:Activity执行onPause → 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中弹出全局Dialog(非Activity样式),当前Activity生命周期会不会触发回调?为什么?
答案:不会触发任何生命周期回调。因为全局Dialog属于Window层面的弹窗,没有创建新的Activity,不会改变当前Activity的焦点状态和可见性,所以生命周期无变化。
10. 从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。
11. App在后台被系统回收,用户重新点击桌面图标打开App,生命周期如何执行?
答案:不会执行onRestart,会重新走完整的创建流程:onCreate → onStart → onResume;
可通过onCreate里的savedInstanceState参数判断是否为重建恢复。
12. Activity A启动Activity B,B再启动C,依次返回A,每一步的生命周期调用顺序是什么?
A→B:A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop。
B→C:B.onPause → C.onCreate → C.onStart → C.onResume → B.onStop。
C→B:C.onPause → B.onRestart → B.onStart → B.onResume → C.onStop → C.onDestroy。
B→A:B.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() → onPause → onStop → onDestroy;
不会执行onStart和onResume,页面创建后立刻销毁。
16.使用startActivityForResult和registerForActivityResult启动Activity,原Activity生命周期调用有区别吗?
答案:生命周期流程完全一致,没有区别。两者只是结果回调方式不同,不会影响生命周期的执行顺序和触发时机。
三、异常生命周期题(进阶,大厂重点)
1.什么情况下会触发Activity的异常销毁?除了屏幕旋转,还有哪些场景?*
答案:异常销毁指系统因配置变化或资源紧张,主动销毁Activity,非用户主动关闭。
常见场景:1. 屏幕旋转、切换分辨率;2. 切换系统语言、字体、主题、深色模式;3. 系统内存不足,回收后台Activity;4. 权限变更;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生命周期是由谁控制的?简述生命周期的分发流程。*
答案:生命周期由AMS(ActivityManagerService)和ActivityThread(主线程)共同控制。
分发流程:AMS决策Activity状态 → 通过Binder通信通知ApplicationThread → ActivityThread接收消息 → 调用H(Handler)切换主线程 → 反射调用Activity对应的生命周期方法。
2. ActivityThread、ActivityManagerService在生命周期中扮演什么角色?*
答案:
- AMS:系统服务,负责管理所有App的Activity生命周期、任务栈、进程优先级,做决策和调度。
- ActivityThread:App的主线程类,管理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. 关闭不需要的Activity;5. 用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,不可见。
- 内存优先级:前台优先级极高,后台优先级低。
- 回收机制:前台几乎不回收,后台按内存紧张程度回收。