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

下载本文档

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

文档简介

Android高级工程师面试题及详细答案(实战干货版)一、Android基础原理进阶1、Activity完整生命周期,以及非常规场景生命周期回调答案:常规生命周期:onCreate->onStart->onResume(前台可交互);退后台:onPause->onStop;销毁:onDestroy。非常规场景高频考点:1)屏幕旋转:默认会销毁重建,执行onPause->onStop->onDestroy->onCreate->onStart->onResume;配置configChanges后只会触发onConfigurationChanged,不会重建。2)Activity透明、弹窗覆盖:只走onPause,不会走onStop,页面依旧处于可见状态,只是失去焦点。3)应用后台被杀重启:会重建Activity,同时恢复savedInstanceState保存的状态,但是静态变量、单例数据会丢失。4)多任务切换、系统回收后台页面:再次打开会触发重建,和旋转屏幕逻辑一致。2、Activity四种启动模式、适用场景、任务栈特点答案:standard:默认模式,每次启动都新建实例,放入当前任务栈。适用于纯展示类、无状态页面,比如详情页。singleTop:栈顶复用。如果目标页面在栈顶,直接复用,只触发onNewIntent;否则新建。适合首页、推送落地页,避免重复打开同一个页面。singleTask:栈内复用。启动时会在当前任务栈查找实例,存在则复用,并清空该实例上方所有Activity,只保留当前页面及下层页面。适合主页、模块主页面,保证全局唯一。singleInstance:全局单例独立任务栈。单独开辟一个任务栈,全局只有一个实例,独占整个栈。适合系统级弹窗、登录页、悬浮窗页面,防止页面堆叠混乱。3、Handler消息机制原理,整体流程及核心问题答案:核心组成:Handler、Message、MessageQueue、Looper。流程:Handler在当前线程绑定Looper,Looper内部持有MessageQueue;Handler发送Message后,消息入队;Looper无限循环从队列取出消息,回调HandlerdispatchMessage,最终执行handleMessage。关键细节:1)主线程默认初始化Looper,子线程需要手动调用Looper.prepare()、Looper.loop(),否则无法使用Handler。2)MessageQueue不是真正的队列,是单向链表,按when时间排序,精准处理延时消息。3)loop方法是阻塞式的,底层通过native阻塞,无消息时释放CPU,不会卡死主线程。4)内存泄漏核心原因:Handler非静态内部类,持有外部Activity引用;延时消息未处理,页面销毁后消息仍持有页面引用,导致无法回收。解决方案:静态Handler+弱引用、页面销毁清空消息。4、Android事件分发机制,滑动冲突解决思路答案:事件分发流程:Activity->ViewGroup->View,核心三个方法:dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent。分发规则:事件从上到下传递,消耗事件后终止传递;ViewGroup可以拦截事件,View没有拦截方法。滑动冲突常见两类:1)内外滑动方向不一致(比如ViewPager嵌套ListView):外部根据滑动方向拦截,横向滑动交给父容器,纵向滑动交给子View。2)滑动方向一致(RecyclerView嵌套RecyclerView):根据滑动距离、速度、点击位置判断,动态修改父容器拦截规则,requestDisallowInterceptTouchEvent禁止父容器拦截。二、性能优化核心(高级岗重点)1、APP启动优化,你实际做过哪些方案,指标如何统计答案:启动分为冷启动、温启动、热启动,优化核心是减少主线程耗时、减少阻塞。实操优化方案:1)任务拆分:主线程只放必须初始化的核心SDK、基础配置;非核心任务(埋点、统计、第三方SDK、本地缓存)全部丢入子线程、延迟初始化。2)布局优化:启动页、首页减少嵌套、减少冗余View,使用merge、include、ViewStub懒加载布局。3)代码优化:移除Application无用初始化,规避主线程IO、循环耗时、反射耗时。4)第三方SDK:延迟初始化、按需初始化,禁止所有SDK在Application全量初始化。5)编译优化:开启R8混淆、资源压缩,减少包体积和加载耗时。指标统计:通过adb命令查看启动耗时、AndroidStudioProfiler检测主线程耗时、自定义启动埋点统计线上真实用户启动时长。2、UI卡顿优化,卡顿原理及排查手段答案:Android系统每16ms刷新一次界面,主线程耗时超过16ms就会丢帧、产生卡顿。卡顿本质是主线程被阻塞、做了耗时操作。卡顿原因:主线程IO、网络请求、大量计算、布局嵌套过深、View频繁刷新、内存抖动、GC频繁。排查方案:1)Profiler抓取主线程堆栈,定位耗时方法;2)使用StrictMode严苛模式,检测主线程磁盘IO、网络违规操作;3)线上通过ANR日志、卡顿日志,统计卡顿堆栈和场景;4)优化手段:耗时操作异步化、布局扁平化、减少invalidate频繁调用、复用对象避免内存抖动。3、内存泄漏常见场景及修复方案,线上如何监控答案:常见内存泄漏场景:1)非静态Handler、匿名内部类持有页面引用;2)静态变量持有Activity、View引用;3)单例持有页面、上下文引用;4)资源未释放:动画、传感器、广播、数据库、文件流;5)RecyclerView缓存、集合未清空数据导致内存常驻。修复方案:静态内部类+弱引用、页面生命周期匹配释放资源、避免全局持有临时页面引用、及时清空集合。线上监控:集成LeakCanary线下检测,线上自研或接入第三方内存监控,采集堆快照、泄漏堆栈,上报后台分析。4、布局优化全套方案答案:1)扁平化布局:减少RelativeLayout、ConstraintLayout过度嵌套,尽量单层布局实现效果;2)按需加载:ViewStub加载不常用布局,首次使用时再inflate;3)复用布局:include抽离公共标题栏、空页面等通用布局;4)减少冗余View:移除无用控件、gone控件及时移除,避免过度绘制;5)优化绘制:减少透明叠加、减少背景重叠,通过开发者模式过度绘制工具检测优化。三、组件进阶与Jetpack1、ViewModel原理、为什么能防页面重建数据丢失答案:ViewModel生命周期独立于Activity,页面因旋转、系统回收重建时,ViewModel不会被销毁,系统会复用原有实例,所以能保留数据。核心原理:ViewModel存在ViewModelStore,由Activity持有,页面重建不会销毁Store,只会重建视图,因此数据保留。只有页面真正销毁退出时,ViewModel才会清空数据。注意点:ViewModel不能持有View、Context引用,容易引发内存泄漏。2、LiveData原理、粘性事件解决方案答案:LiveData是可观察的数据持有者,具备生命周期感知能力,只会给活跃状态的页面分发数据,页面销毁自动解绑,无内存泄漏。粘性事件问题:新注册的观察者会收到之前已经发送过的数据,属于默认机制。解决方案:1)自定义LiveData区分新旧数据;2)使用Event包装类,标记事件是否已消费;3)单页面单次事件使用SharedFlow替代。3、Coroutine协程原理、优势、异常处理答案:协程是轻量级线程,基于线程调度,开销远小于线程,支持串行写法实现异步逻辑,避免回调地狱。核心优势:代码简洁、结构化异步、自带生命周期感知、支持精准取消、异常统一捕获。异常处理:通过try-catch包裹挂起函数、使用CoroutineExceptionHandler全局捕获协程异常、supervisorJob实现子协程异常不影响父协程。四、跨进程通信IPC1、Android常见IPC方式及优缺点、适用场景答案:1)Bundle:简单易用,支持基本数据、序列化对象,缺点是数据大小有限,适合页面、简单进程传值。2)文件共享:适合大批量静态数据,缺点是实时性差、并发读写有问题。5)ContentProvider:适合跨进程数据共享、数据库共享,系统级封装,权限完善。6)Socket:网络套接字,适合跨设备、跨进程长连接通信。答案:Binder是Android核心跨进程通信内核驱动,实现一次拷贝、高效通信。区别于Linux管道、Socket的两次拷贝,Binder性能更高,适合移动端频繁跨进程交互。核心流程:客户端发起调用->数据打包->Binder驱动转发->服务端解析执行->返回结果。五、网络与并发1、OkHttp核心原理、拦截器执行流程答案:OkHttp核心:连接池、拦截器、缓存、重试、超时机制。拦截器执行顺序:自定义拦截器->日志拦截器->桥接拦截器->缓存拦截器->连接拦截器->请求拦截器,采用责任链模式,层层处理请求和响应。连接池:复用Socket连接,减少三次握手四次挥手开销,提升网络请求速度。超时机制:区分连接超时、读取超时、写入超时、总超时,精准控制请求生命周期。2、Retrofit原理答案:Retrofit是基于OkHttp的RESTful网络框架,核心是动态代理。通过注解解析请求参数、请求方式、接口地址,动态生成网络请求实现类,最终交由OkHttp完成真实请求。优势:解耦、配置统一、支持多种转换器、适配协程、RxJava,适合大型项目网络层封装。3、线程池原理、核心参数、Android常用线程池答案:线程池核心参数:核心线程数、最大线程数、空闲超时时间、任务队列、线程工厂、拒绝策略。执行规则:任务优先放入核心线程,核心线程满入队列,队列满开启非核心线程,达到最大线程数触发拒绝策略。Android常用:FixedThreadPool(固定线程,适合密集任务)、CachedThreadPool(弹性线程,适合短时任务)、SingleThreadPool(单线程,有序执行)、ScheduledThreadPool(定时任务)。开发规范:禁止手动newThread,统一使用全局线程池,避免线程泛滥、OOM、卡顿。六、源码与高级实战1、RecyclerView复用原理、四级缓存机制答案:RecyclerView核心是ViewHolder复用,避免频繁inflate、findViewById,大幅提升滑动性能。四级缓存:1)ViewCacheExtension:自定义缓存,优先级最高;2)RecyclerViewPool一级缓存:屏幕内移除的ViewHolder,直接复用,无需重新绑定数据;3)RecyclerViewPool二级缓存:屏幕外缓存的ViewHolder,需要重新bind数据;4)ViewHolder缓存池:跨RecyclerView全局复用,多列表共用缓存,减少对象创建。复用流程:优先从缓存取ViewHolder,无缓存才创建、绑定数据,实现高效滑动。2、ANR产生原因、常见场景、排查方式答案:ANR核心:主线程长时间阻塞,系统判定无响应。触发阈值:按键/触摸事件5s、广播10s、服务20s。常见场景:主线程网络、主线程大文件IO、死循环、锁等待、数据库耗时操作、大量布局刷新。排查方式:导出/data/anr/traces.txt日志,查看主线程堆栈,定位阻塞代码;结合Profiler、严苛模式复现问题并优化。七、架构设计与工程化1、MVVM架构原理、优缺点、和MVC/MVP区别答案:MVC:Model-View-Controller,Controller耦合Activity,职责混乱,适合小项目,大型项目难以维护。MVP:Presenter解耦View和Model,接口过多,样板代码量大,内存开销大。MVVM:View-ViewModel-Model,通过数据驱动UI,双向绑定、单向数据流,无过多接口,职责清晰。ViewModel生命周期独立,适配页面重建,结合Jetpack组件适配性极强。MVVM优势:解耦彻底、可测试、适配生命周期、减少冗余代码、适合团队协作开发。2、组件化、模块化核心思路、通信方案答案:核心思想:按业务拆分模块,各业务独立开发、独立编译、独立调试,解决大型项目

温馨提示

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

评论

0/150

提交评论