版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Android高级开发面试题及详细答案(实战版)本文档汇总互联网大厂Android高级开发高频面试题,涵盖基础进阶、四大组件核心、源码原理、性能优化、多线程、网络、内存、混合开发、架构设计等核心模块,答案基于一线开发实战经验编写,贴合真实面试打分标准,无理论空话。一、Android基础进阶核心题1.讲一下Activity启动模式及实际应用场景Activity共有四种标准启动模式,核心是管控Activity栈的复用规则,解决页面重复创建、栈堆叠混乱问题,具体如下:standard(标准模式):默认模式。每次启动都会新建一个Activity实例,无论栈中是否存在该页面,所有启动方式都适用。常用于首页、详情页等无复用需求的普通页面。singleTop(栈顶复用):如果当前Activity处于栈顶,再次启动不会新建实例,会触发onNewIntent()回调;若不在栈顶,则新建实例。适合搜索页、弹窗式页面,避免用户重复点击打开多个相同页面。singleTask(栈内复用):整个任务栈内只存在一个该Activity实例。启动时若栈中已存在该实例,会清空其上方所有Activity,将该页面置顶,同时触发onNewIntent();不存在则新建。常用于首页、登录页、主界面,比如从多级详情页返回首页,直接清空中间所有页面。singleInstance(单例全局复用):单独开辟一个独立任务栈,全局仅存在一个实例,所有应用跳转该页面都会复用这个实例。适合系统级页面、闹钟弹窗、来电界面等全局唯一页面,业务开发中极少使用。拓展实战点:日常开发中singleTask最常用,需注意它会清空上层Activity的特性,避免页面回退逻辑异常;启动模式可在Manifest配置或Intent动态指定,动态指定优先级更高。2.Activity完整生命周期,以及前台后台切换的生命周期执行顺序完整生命周期核心方法:onCreate()->onStart()->onResume()->onPause()->onStop()->onDestroy(),另有两个补充方法:onRestart()。各方法核心作用:onCreate():页面首次创建,仅执行一次,用于初始化布局、控件、全局数据onStart():页面可见但不可交互,可做数据预加载、状态初始化onResume():页面前台可交互,开启动画、轮询、网络刷新、传感器监听onPause():页面失去焦点,暂停耗时操作、保存临时数据、关闭弹窗onStop():页面完全不可见,释放大量资源、停止网络请求、销毁定时器onRestart():页面从后台切换前台触发,无销毁重建场景onDestroy():页面销毁,彻底释放所有资源、解绑监听、终止线程场景执行顺序:App前台切后台:onPause()->onStop()App后台切前台:onRestart()->onStart()->onResume()页面横竖屏切换(默认配置):onPause()->onStop()->onDestroy()->onCreate()->onStart()->onResume(),可通过configChanges禁止重建。3.横竖屏切换Activity重建怎么解决?如何保存状态?默认情况下,横竖屏切换会触发屏幕配置变更,系统会销毁并重建Activity,导致临时数据丢失、页面闪烁。解决方案一:配置configChanges禁止重建在Manifest对应Activity节点添加:android:configChanges="orientation|screenSize|keyboardHidden",配置后切换屏幕不会重建Activity,只会触发onConfigurationChanged()回调,可在该方法中手动适配布局、控件尺寸。解决方案二:onSaveInstanceState保存状态无需禁止重建,通过系统回调保存临时数据。页面销毁前会执行onSaveInstanceState(Bundle),将文本输入、列表位置、选中状态等临时数据存入Bundle;重建后在onCreate()或onRestoreInstanceState()中取出数据恢复页面状态。实战注意:该方法仅适合保存轻量临时数据,不适合大图、大量列表数据;大量数据建议用ViewModel存储,配置变更时ViewModel不会销毁,自动保留数据。二、Fragment核心原理面试题1.Fragment生命周期与Activity的联动关系Fragment没有独立的进程和线程,生命周期完全依附于承载的Activity,Activity的生命周期变化会直接驱动Fragment对应回调执行,且Fragment生命周期回调晚于Activity。核心联动顺序(Activity打开):ActivityonCreate()->FragmentonAttach()->onCreateView()->onViewCreated()->ActivityonStart()->FragmentonStart()->ActivityonResume()->FragmentonResume()页面销毁顺序相反:Fragment先执行暂停、停止、销毁,最后Activity销毁。2.Fragment重叠、错乱问题原因及解决方案问题原因:页面重建(横竖屏、系统回收)时,Fragment会被系统自动保存并恢复,若代码中再次主动addFragment,会重复创建实例,导致多层Fragment重叠;同时事务未提交、状态未保存也会引发错乱。解决方案:重建时先判断Fragment是否已经存在,通过findFragmentByTag查找,存在则复用,不再重复add优先使用replace替换Fragment,避免多次add叠加;需要栈复用时使用add+hide/show事务提交使用commitAllowingStateLoss替代commit,避免页面状态保存后提交事务崩溃(仅在生命周期回调中使用)配合ViewModel管理Fragment数据,重建后无需重复初始化三、Android多线程与并发(高级重点)1.Handler机制原理、消息队列处理流程,为什么不会ANR?Handler是Android线程通信核心机制,核心组件包含:Handler、Message、MessageQueue、Looper。整体流程:子线程通过Handler发送Message/Runnable消息,消息会存入当前线程绑定的MessageQueue(消息队列,先进先出);Looper是消息循环器,无限循环从队列中取出消息,分发到Handler的handleMessage()主线程回调中执行,实现子线程切换主线程更新UI。核心关键点:主线程默认初始化Looper,子线程需要手动调用Looper.prepare()、Looper.loop()才能使用HandlerMessageQueue是阻塞队列,无消息时会阻塞休眠,不会占用CPU资源Message建议复用obtain(),避免频繁创建对象引发内存抖动为什么Handler循环不会ANR?ANR的本质是主线程阻塞、无法响应系统事件(触摸、按键、广播)。Looper.loop()是死循环,但队列无消息时会阻塞挂起,释放CPU;只有队列中有消息时才会执行任务。ANR只会在单个消息执行耗时过长(超过5秒)时触发,而非循环本身导致。2.线程池核心参数、工作原理,开发中如何选型?Android推荐使用ThreadPoolExecutor自定义线程池,避免系统自带线程池的弊端,核心参数5个:corePoolSize:核心线程数,常驻线程,不会被回收maximumPoolSize:最大线程数,任务过载时创建非核心线程keepAliveTime:非核心线程闲置超时时间,超时自动回收unit:超时时间单位workQueue:任务阻塞队列,存储等待执行的任务线程池工作流程:1.新任务到来,判断当前线程数是否小于核心线程数,是则新建核心线程执行任务;2.核心线程已满,任务存入阻塞队列;3.队列已满,新建非核心线程执行任务;4.线程数达到最大值,触发拒绝策略。实战选型:IO密集型(网络、文件读写、图片加载):核心线程数设置2-4,IO任务阻塞不占用CPU,可多并发CPU密集型(解析数据、算法计算):核心线程数=设备CPU核心数+1,避免线程切换耗时禁止使用Executors静态方法创建线程池,容易出现OOM、任务堆积问题3.同步锁Synchronized与Lock的区别Synchronized:系统级隐式锁,JVM底层实现,自动加锁解锁。优点:使用简单、无需手动管理、不会死锁;缺点:灵活性差、无法中断等待线程、无法设置超时、读写锁区分度低。Lock(ReentrantLock):代码层显式锁,手动加锁解锁。优点:灵活性高、可中断锁等待、可设置超时时间、支持读写分离(ReentrantReadWriteLock)、可多次重入;缺点:需要手动unlock,遗漏会导致线程死锁。实战场景:简单同步场景用Synchronized;高并发读写分离、需要超时控制、中断等待的场景用Lock。四、性能优化(高级核心面试模块)1.APP启动优化怎么做?启动流程和优化方案APP启动流程:点击图标->进程创建->Application初始化->闪屏页->主Activity初始化->页面渲染完成。启动耗时主要集中在Application和首页初始化。全套优化方案:任务拆分:将Application中耗时的第三方初始化、数据预加载、工具类初始化拆分,主线程只保留核心必要初始化,非核心任务延迟到首页渲染完成、空闲时执行异步初始化:通过线程池、Coroutine异步初始化第三方SDK,做好初始化状态容错,避免异步未完成导致功能异常延迟加载:使用JetpackStartup按需初始化,替代全局统一初始化;非首页模块、小众功能SDK用时再初始化精简布局:首页布局减少层级、去除冗余控件、减少自定义控件绘制耗时资源优化:压缩图片、移除无用资源、避免启动时大量资源加载卡顿监控:通过Systrace、Perfetto抓取启动耗时,定位阻塞主线程的代码2.内存泄漏常见场景、检测方案、解决思路高频内存泄漏场景:静态变量持有Activity、Fragment实例,导致页面销毁无法回收子线程、Handler延时任务持有页面引用,任务未完成页面销毁匿名内部类、异步回调隐式持有外部类引用资源未释放:Bitmap、文件流、数据库、传感器、广播监听未注销集合持续添加数据、未及时清空,导致对象无法回收WebView内存泄漏,独立进程未及时销毁检测工具:AndroidStudioProfiler、LeakCanary、MAT分析堆快照通用解决思路:避免静态持有页面实例,静态变量尽量只存储基础数据页面销毁时终止子线程、移除Handler所有消息、取消异步任务使用弱引用(WeakReference)替代强引用持有页面所有注册监听、资源打开必须成对注销、关闭页面销毁清空集合数据、置空引用,帮助GC回收3.UI卡顿原理及优化手段Android系统每16ms刷新一次UI,对应帧率60fps,单次绘制耗时超过16ms就会丢帧、产生卡顿。卡顿核心原因是主线程耗时操作、UI绘制耗时。优化方案:主线程减负:所有网络请求、数据解析、文件读写、耗时计算全部移至子线程布局优化:减少布局嵌套层级,优先使用ConstraintLayout;去除GONE冗余控件;复用include、merge标签绘制优化:减少自定义控件onDraw中耗时操作、避免频繁创建对象、减少过度绘制列表优化:RecyclerView复用Item、预加载优化、避免onBindViewHolder耗时、减少Item刷新范围内存抖动优化:避免循环、频繁回调中创建对象,复用对象、数组五、网络与数据缓存1.OkHttp核心原理、拦截器执行流程OkHttp是安卓主流网络请求框架,核心优势是高效、支持连接复用、请求重试、拦截机制,核心组件:Request、Response、Client、Interceptor、连接池。拦截器执行流程(责任链模式):请求发起后,依次经过:自定义应用拦截器->桥接拦截器(补全请求头、参数)->缓存拦截器(读取/写入缓存)->连接拦截器(获取连接池连接)->请求拦截器(发送请求)->响应拦截器,最终返回Response,响应流程逆向回调。核心特性:连接池复用TCP连接,减少三次握手四次挥手耗时,提升请求速度支持自动重试、重定向拦截器可统一处理请求头、签名、日志、缓存、异常,解耦业务代码2.网络缓存策略设计(实战级)主流采用「内存缓存+磁盘缓存+网络兜底」三级缓存策略:内存缓存:缓存高频访问的列表数据、首页数据,速度最快,APP重启失效,使用LruCache实现,控制最大内存占用,避免OOM磁盘缓存:缓存图片、离线数据、接口响应数据,持久化存储,APP重启有效,通过OkHttp缓存或自定义文件缓存实现网络兜底:无缓存/缓存过期时,请求网络更新数据,同时更新本地缓存缓存更新策略:时间过期策略+主动刷新,常规数据设置固定过期时间,热门数据手动触发更新,兼顾体验和实时性。六、Jetpack架构核心1.ViewModel原理,为什么能防页面重建数据丢失?ViewModel是Jetpack数据管理组件,核心作用是存储页面数据、分担页面逻辑,生命周期独立于Activity/Fragment。核心原理:ViewModel的实例由ViewModelProvider统一管理,存储在Activity的ViewModelStore中。页面因配置变更(横竖屏)重建时,只会销毁页面视图,不会销毁ViewModelStore,因此ViewModel实例得以保留,数据不会丢失。只有页面真正销毁(退出页面、销毁进程)时,ViewModel的onCleared()才会触发,数据销毁。实战优势:无需手动保存恢复数据、解耦页面和数据逻辑、适配生命周期、配合LiveData实现数据自动刷新UI。2.LiveData核心原理、粘性事件解决方案LiveData是可感知生命周期的数据持有者,核心特点是只给活跃页面分发数据,自动规避页面销毁后更新UI的崩溃。粘性事件问题:新注册的观察者会收到之前已经发送过的最新数据,导致页面重复刷新、弹窗重复弹出。解决方案:使用SingleLiveEvent:单次事件分发,消费后清空数据,仅触发一次回调自定义LiveData包装类,通过标记位区分新旧事件,过滤历史粘性数据事件总线区分普通数据和单次事件,避免混用LiveData七、开源框架源码与原理1.RecyclerView复用原理、缓存机制RecyclerView核心优势是多级缓存,极致优化列表滑动性能,避免频繁创建销毁View。四级缓存机制(优先级从高到低):ViewCacheExtension(自定义缓存):开发者自定义缓存逻辑,默认空实现RecyclerViewPool(共享缓存):多个RecyclerView共享的缓存池,缓存脱离屏幕的ItemView,跨列表复用Scrap(临时缓存):屏幕内临时移除的Item,快速复用,无需重新绑定数据Cache(默认缓存):缓存少量移出屏幕的Item,默认缓存2个,直接复用View和数据复用流程:需要Item时,先从各级缓存查找,有则直接复用;无则从缓存池获取,仍无则新建View,极大减少inflate耗时。2.Glide图片加载核心原理、缓存机制Glide核心是三级缓存+异步加载+图片预处理,适配各种图片场景,避免OOM。三级缓存:活动缓存:正在使用的图片资源,弱引用存储,防止复用中被回收内存缓存:LruCache存储最近使用的图片,速度最快,APP重启失效磁盘缓存:持久化缓存原图、裁剪图,离线可用核心优势:自动根据ImageView尺寸裁剪图片,避免加载大图导致内存溢出;支持生命周期绑定,页面销毁自动终止加载,杜绝内存泄漏。八、进阶架构与项目实战1.MVC、MVP、MVVM架构区别及选型MVC:Model(数据)、View(视图)、Controller(Activity)。Activity承担视图和控制器职责,代码耦合严重,页面臃肿,适合简单项目,大型项目维护成本极高。MVP:拆分Presenter层处理业务逻辑,View和Model完全解耦,通过接口通信。缺点是接口过多、类文件冗余,适合中小型项目,目前逐步被MVVM替代。MVVM:Model、View、ViewModel。ViewModel双向绑定数据,无需定义大量接口,数据驱动UI,生命周期感知,解耦
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古代文献修复师评价表
- 无人机销售顾问销售转化率绩效评定表
- 教育培训顾问教学服务及续班率KPI考核表
- 通信工程师技术能力与项目实施绩效考评表
- 订单付款方式变更声明(7篇)
- 关于2026年系统升级实施日期的通知函(5篇范文)
- 福建环境岗事业单位面试自测卷2026配套答题思路
- 湖南财会岗2026事业单位面试模拟练习习题汇编配套答题思路
- 2026事业单位农业岗巩固自测题含解析
- 福建财会岗2026事业编面试自测卷配套答题思路含解析
- 服装设计师作品组绩效衡量表
- 河南省部分高中2026-2027学年高二上学期9月联考数学试卷(含答案)
- 2025“外研社国才杯”“理解当代中国”外语能力综合能力赛项(英语组)模拟样卷
- 2026年河北高考历史真题(试卷+解析)
- 人教版2026-2027学年高中物理必修第三册第9章-13章期中测试卷(含解析)
- 2026年企业合规师初级题库及答案
- 2026年武汉市中考语文试卷(含答案)
- 司法辅助人员笔试完整题型、分值及真题答案
- 陕西科技大学教师专业技术职务评审工作实施办法(试行)
- 肿瘤患者输血支持(医学课件)
- 2026中国土地用途管制制度创新与实施效果评估报告
评论
0/150
提交评论