Android 高级面试题及详细答案(实战向)_第1页
Android 高级面试题及详细答案(实战向)_第2页
Android 高级面试题及详细答案(实战向)_第3页
Android 高级面试题及详细答案(实战向)_第4页
Android 高级面试题及详细答案(实战向)_第5页
已阅读5页,还剩3页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Android高级面试题及详细答案(实战向)一、Android基础与系统原理(高级深挖)1、Activity启动流程、生命周期源码级流程,以及冷启动、热启动区别?详细答案:Activity启动核心是应用进程与AMS通信、任务栈调度、窗口绘制的完整流程,整体分为5个核心步骤:1.客户端通过Instrumentation向AMS发起启动请求;2.AMS校验权限、任务栈、启动模式,判定目标Activity实例状态;3.AMS通知应用进程,通过Binder回调应用的ApplicationThread;4.应用通过Instrumentation创建Activity实例,依次执行attach、onCreate、onStart、onResume;5.完成View树绘制、窗口显示,页面正式可见可交互。冷启动:应用进程未创建,系统需要先创建进程、初始化Application、加载资源、初始化Activity,耗时最长,是启动优化核心场景。热启动:应用进程常驻,仅需要重新走Activity生命周期(onStart、onResume),无需初始化Application和进程,速度极快。补充考点:onResume之后页面才具备交互能力,onStart仅代表页面可见,未完成焦点获取和绘制就绪。2、Activity四种启动模式的实际场景、任务栈行为,以及singleInstance特性?详细答案:standard(默认):每次启动都会新建实例,无论栈中是否存在,任务栈可叠加多个相同页面。适用于列表详情、多开页面场景。singleTop:栈顶存在目标页面则复用,触发onNewIntent,不新建实例;栈中存在但不在栈顶仍会新建。适用于首页、搜索页,防止重复打开。singleTask:栈内存在目标实例,会清空该页面之上的所有页面,复用当前实例并触发onNewIntent。适用于登录页、首页、主界面,保证栈内唯一。singleInstance:独立独占任务栈,全局仅此一个实例,新启动会切到对应栈,其他页面无法进入该栈。适用于系统级弹窗、悬浮窗页面、独立业务弹窗。实际开发中,首页基本用singleTask,详情页默认standard,登录页优先singleTask,需要全局唯一弹窗页面用singleInstance。3、Handler消息机制原理,为什么不会ANR?MessageQueue阻塞原理?详细答案:Handler机制核心四组件:Handler、Message、MessageQueue、Looper。1.Looper:绑定当前线程,一个线程仅有一个Looper,无限循环调用loop()方法,不断从MessageQueue取消息;2.MessageQueue:消息队列,底层是单向链表,存储所有待执行的Message;3.Handler:消息发送和处理入口,sendMessage/post最终都会将消息入队;4.消息出队后,回调HandlerdispatchMessage,执行handleMessage或runnable。MessageQueue阻塞原理:队列无消息时,会通过native方法进入阻塞状态,释放CPU,不会空轮询耗电;有新消息入队时唤醒线程。为什么主线程Handler不会ANR:ANR是主线程阻塞超过阈值(5s输入事件、10s广播),Looper是死循环但无消息时阻塞休眠,有消息才执行,不会占用主线程卡死,只有主线程执行耗时操作才会触发ANR。高频坑点:子线程默认无Looper,直接newHandler会报错;主线程系统默认初始化Looper。二、性能优化(高级核心,面试重点)1、APP启动优化完整方案,你线上做过哪些落地优化?详细答案:启动优化核心目标:减少主线程耗时、缩短首屏渲染时间、避免阻塞UI线程,分为三个阶段优化:1.Application初始化优化移除主线程冗余初始化,第三方SDK、工具类、日志、埋点全部延迟初始化、子线程初始化、懒加载;区分冷启动、热启动、推送拉起、桌面图标拉起场景,差异化初始化。2.任务拆分与调度优化使用启动任务调度框架,将同步任务改为异步任务,依赖任务有序执行,无依赖任务并行执行;利用IdleHandler在页面空闲时执行非紧急任务。3.首屏渲染优化减少首屏布局层级、减少过度绘制,首屏避免加载大图、避免卡顿动画;使用占位图替代实时数据渲染,提前完成窗口初始化。4.编译与资源优化开启R8混淆、资源压缩,去除无用资源、冗余代码;开启分包、动态下发非核心资源。线上落地效果:优化后冷启动耗时从800ms+降至300ms以内,极低机型无启动黑屏、卡顿问题。2、Android卡顿优化完整思路,如何精准定位卡顿?详细答案:卡顿本质:主线程在一帧16ms内未完成测量、布局、绘制、事件处理,导致丢帧。卡顿定位手段:1.系统工具:Systrace抓取帧绘制流程,精准定位耗时方法、卡顿节点;2.线上监控:通过主线程消息调度监控,捕获超过100ms的主线程任务,上报堆栈信息;3.代码埋点:监控View绘制、页面生命周期、点击事件耗时。核心优化方案:1.主线程禁止耗时操作:网络请求、文件读写、数据库操作全部移至子线程;2.布局优化:减少嵌套层级、避免wrap_content过度测量、减少动态inflate频繁调用;3.列表卡顿优化:RecyclerView复用、预取机制、异步Diff刷新、避免onBind耗时操作;4.动画优化:开启硬件加速,避免视图频繁刷新、属性动画替代帧动画。3、内存泄漏常见场景、排查手段、解决方案?详细答案:常见内存泄漏场景:静态变量持有Activity、View引用;匿名内部类、Handler、Runnable隐式持有外部类引用;网络请求、异步任务页面销毁后未取消;监听、广播、回调未注销;Bitmap未及时回收、大图常驻内存;单例持有页面引用,导致页面无法回收。排查工具:AndroidStudioProfiler、MAT、LeakCanary线上监控。通用解决方案:1.避免静态持有页面视图引用;2.使用静态Handler+弱引用关联页面;3.页面销毁时取消所有异步任务、网络请求、定时器;4.页面生命周期匹配注册与注销,成对调用;5.图片按需加载、复用图片缓存,页面销毁清空临时资源。三、Android进阶核心(源码与机制)1、View绘制三大流程:measure、layout、draw核心原理?详细答案:View绘制由ViewRootImpl触发,从performTraversals开始,依次执行三大流程:1.Measure测量:根据父控件传递的MeasureSpec(测量模式+测量尺寸),计算View的宽高尺寸,最终setMeasuredDimension保存测量结果。测量模式分为EXACTLY、AT_MOST、UNSPECIFIED。2.Layout布局:父控件根据子View测量尺寸,确定子View在父容器中的位置,调用setFrame确定上下左右坐标。3.Draw绘制:依次绘制背景、图层、子View、装饰、焦点状态,通过Canvas完成画布绘制。核心区别:measure可多次执行,layout、draw一般单次执行;频繁requestLayout会重复测量布局,引发卡顿。2、RecyclerView复用原理、缓存机制,四级缓存分别作用?详细答案:RecyclerView核心优势是视图复用、局部刷新、高效缓存,避免频繁inflate创建View,解决ListView卡顿、缓存混乱问题。四级缓存机制(由轻到重):1.ViewCacheExtension(一级):开发者自定义缓存,默认空,优先级最高;2.RecyclerViewPool内部缓存(二级):屏幕内刚移出、即将复用的ViewHolder,无需重新绑定数据,速度最快;3.RecyclerViewPool共享缓存(三级):跨页面、多列表共享的缓存池,只缓存View类型,不缓存数据,复用时需要重新onBind;4.DiskCache(四级磁盘缓存):拓展缓存,缓存离线视图资源,极少使用。核心考点:notifyItemChanged只刷新单条数据,不会重建视图;notifyDataSetChanged全局刷新,清空所有缓存,性能极差,开发中禁止滥用。3、Binder机制原理,为什么Android选用Binder而非Socket、管道?详细答案:Binder是Android专属跨进程通信机制,基于内存映射实现。核心原理:内核开辟专属内存缓冲区,通过mmap内存映射,用户态与内核态共享内存数据,减少数据拷贝次数。对比其他IPC优势:1.Socket:基于网络读写,开销大、速度慢、适合跨设备通信,不适合本机进程通信;2.管道、消息队列:需要两次数据拷贝,开销高于Binder;3.Binder:仅一次数据拷贝,开销小、延迟低、安全性高,支持权限校验、线程调度,完美适配系统服务与应用通信。四、架构与工程化(高级必备)1、MVVM与MVC、MVP区别,各自优缺点,你项目如何选型?详细答案:MVC:Model数据、View视图、Controller控制器(Activity/Fragment)。优点简单直观,缺点Activity职责过重,耦合严重,难以单元测试,适合简单页面。MVP:View、Model、Presenter中间层。解耦视图与业务,Presenter承载逻辑,支持单元测试;缺点接口过多、模板代码冗余、双向绑定繁琐。MVVM:View、Model、ViewModel。核心是数据双向绑定、单向数据流,ViewModel生命周期独立,不持有View引用,配置变更不重建,无内存泄漏风险。项目选型:目前主流项目全部采用MVVM+组件化+单例仓库模式,配合LiveData、StateFlow实现数据驱动UI,减少冗余代码,便于维护和迭代。2、组件化、模块化区别,组件化通信方案与避坑点?详细答案:模块化:代码维度拆分,按功能拆分module,所有模块必须整体编译,依赖关系固定,无法单独运行。组件化:在模块化基础上,支持组件独立编译、独立运行、按需集成,业务组件完全解耦,无硬依赖。组件通信方案:路由(ARouter)跨组件页面跳转、接口下沉、事件总线、服务暴露调用。避坑点:禁止组件直接相互依赖、禁止跨组件强引用;所有跨组件调用通过路由/服务接口中转;统一组件初始化时机,避免并发初始化异常。3、Gradle编译优化、打包优化你做过哪些落地?详细答案:1.编译速度优化:开启Gradle守护进程、增量编译、缓存机制;关闭不必要的校验、lint、测试任务;配置并行编译。2.包体积优化:开启R8代码压缩、资源压缩;删除无用资源、冗余依赖;图片压缩、webp格式替换;动态下发非核心资源。3.依赖优化:统一依赖版本、去除重复依赖、排除冗余依赖;采用动态版本管理,避免版本冲突。4.构建稳定性优化:固定编译版本、缓存构建产物,解决打包偶现异常问题。五、网络与并发(高频面试难点)1、OkHttp核心原理、拦截器流程、连接池复用机制?详细答案:OkHttp是安卓主流网络框架,核心优势是拦截器机制、连接池复用、请求重试、缓存策略。五大拦截器执行顺序:重试拦截器->桥接拦截器->缓存拦截器->连接拦截器->自定义拦截器->网络请求。连接池复用原理:维护空闲连接队列,相同域名、端口、协议的连接可复用,避免每次请求新建TCP连接,减少三次握手四次挥手开销;空闲连接超时自动释放,避免资源占用。常用落地优化:统一超时时间、请求头统一配置、日志拦截器、token自动刷新、失败重试机制。2、Android线程池原理,核心参数含义,日常怎么选型?详细答案:线程池核心构造参数:核心线程数、最大线程数、空闲超时时间、任务队列、线程工厂、拒绝策略。参数含义:核心线程常驻,最大线程数是峰值上限,队列缓存等待任务,避免频繁创建销毁线程。日常选型:1.IO密集型(网络、文件):核心线程数适当偏大;2.CPU密集型(计算、解析):核心线程数等于CPU核心数,避免抢占CPU;3.禁止使用Executors静态创建线程池,容易出现队列溢出、线程无限创建问题,生产环境必须自定义线程池。六、系统适配与疑难问题1、Android10/11/13核心权限适配要点?详细答案:1.Android10:分区存储,禁止直接读写外部存储,必须使用MediaStore或SAF框架;后台定位权限单独适配。2.Android11:彻底强制执行分区存储,仅白名单应用可申请所有文件访问权限;隐私权限精

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论