【Android面试】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与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(恢复数据)
禁止重建:

android:configChanges=“orientation|screenSize|keyboardHidden”
@Override
public 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,生命周期执行顺序是什么?

答案:分两种情况:

  1. B已在栈内:A.onPause → B.onNewIntent → B.onRestart → B.onStart → B.onResume → A.onStop → A.onDestroy。
  2. B不在栈内:A.onPause → B.onCreate → B.onStart → B.onResume → A.onStop。

10. App在后台被系统回收,用户重新点击桌面图标打开App,生命周期如何执行?

答案:不会执行onRestart,会重新走完整的创建流程:onCreate → onStart → onResume;
可通过onCreate里的savedInstanceState参数判断是否为重建恢复。

11. 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() → 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屏幕旋转时销毁重建?有哪些实现方式?

答案:常用两种方式:

  1. 清单文件配置:在Activity标签添加android:configChanges=“orientation|screenSize|keyboardHidden”,拦截配置变更,不重建,回调onConfigurationChanged。
  2. 代码处理:监听旋转事件,手动处理布局,不依赖系统重建。

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,不可见。
  • 内存优先级:前台优先级极高,后台优先级低。
  • 回收机制:前台几乎不回收,后台按内存紧张程度回收。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值