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

下载本文档

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

文档简介

Android高级工程师面试题(含详细实战答案)一、Android基础与进阶核心(必问)1.说说Activity启动流程、生命周期,以及前台后台切换的生命周期回调参考答案:常规Activity启动核心流程:点击页面控件发起startActivity,最终调用AMS跨进程校验权限、任务栈、启动模式,AMS通知应用进程的ActivityThread,通过Instrumentation创建Activity实例,依次执行生命周期。完整生命周期:onCreate->onStart->onResume(前台可交互)退到后台:onPause->onStop;再次切回前台:onStart->onResume销毁流程:onPause->onStop->onDestroy面试高频坑点:1.页面透明、弹窗覆盖当前Activity,只会触发onPause,不会走onStop;只有页面完全不可见才会onStop。2.系统内存不足杀后台进程,重建页面时,只会回调onCreate、onStart、onResume,不会走onRestoreInstanceState单独方法(该方法是可选状态恢复)。3.横竖屏切换默认销毁重建Activity,可通过configChanges禁止重建。2.Activity四种启动模式、适用场景、任务栈特点参考答案:1.standard(默认):每次启动都新建实例,不管栈中是否存在,适用于首页、列表页等常规页面。2.singleTop:栈顶复用,如果要启动的Activity在栈顶,直接复用,不走onCreate,只回调onNewIntent;不在栈顶则新建。适用于详情页、搜索页,避免重复打开。3.singleTask:栈内复用,整个任务栈内存在该实例,会清空该实例之上的所有Activity,复用当前实例并回调onNewIntent。核心适用场景:首页、主页面,返回时直接回到首页,清空中间所有页面。4.singleInstance:全局单例,独立任务栈,独占一个栈,整个系统只有一个实例。适用于系统级弹窗、悬浮窗页面、独立登录页,极少用在普通业务项目。3.Handler机制原理,以及为什么会内存泄漏、怎么解决参考答案:核心机制:Handler、Message、MessageQueue、Looper四组件联动。1.Looper:每个线程唯一,持有MessageQueue,无限循环取消息;主线程默认初始化Looper,子线程需要手动prepare和loop。2.MessageQueue:消息队列,存放Message,先进先出,底层是链表结构。3.Handler:用来发送、处理消息,绑定当前线程的Looper。4.Message:携带消息数据、what、obj、target(绑定Handler)。内存泄漏原因:非静态内部类Handler会隐式持有外部Activity引用;延时消息会留在MessageQueue中,Message持有Handler引用。如果页面关闭时消息还未执行,Activity引用无法被回收,造成泄漏。解决方案:1.自定义静态Handler,使用弱引用持有Activity/Fragment;2.页面销毁(onDestroy)时,调用removeCallbacksAndMessages(null)清空所有消息;3.杜绝匿名内部类Handler写延时任务。4.线程池核心参数、工作原理,项目中怎么用参考答案:核心参数:核心线程数、最大线程数、空闲超时时间、任务队列、线程工厂、拒绝策略。工作流程:1.新任务进来,当前核心线程数未满,新建核心线程执行任务;2.核心线程已满,任务进入阻塞队列排队;3.队列满了,新建非核心线程执行任务;4.总线程数达到最大值,触发拒绝策略。项目实战用法:网络请求用IO密集型线程池(核心线程数多一点),本地计算、解析数据用CPU密集型(核心线程数=CPU核心数);禁止多处新建线程池,全局统一管理,页面销毁取消对应任务,避免空线程常驻、内存浪费。二、性能优化核心(高级岗重点考察)1.APP启动优化怎么做?启动流程和优化手段参考答案:启动分为三个阶段:1.冷启动:进程未创建,从头启动APP(最慢,优化重点);2.温启动:进程存在,Activity销毁重建;3.热启动:后台切回前台,几乎无耗时。实战优化手段:1.主线程减负:Application、SplashActivity的onCreate中禁止耗时操作,第三方SDK延迟初始化、异步初始化;2.任务拆分:启动任务区分必须初始化(日志、基础配置)和延迟初始化(统计、推送、埋点);3.布局优化:启动页减少过度嵌套、去除冗余View,避免启动时inflate大量布局;4.线程优化:启动任务复用全局线程池,避免频繁创建销毁线程;5.版本升级、本地数据库迁移放到子线程,不阻塞主线程;6.使用启动任务调度框架(JetpackStartup)统一管理初始化任务,控制任务依赖和优先级。2.内存泄漏常见场景、排查手段、修复方案参考答案:常见场景:1.静态变量持有Activity/Context引用;2.非静态Handler、延时任务、postDelay;3.单例持有页面引用;4.集合未及时清空数据(List、Map缓存页面数据);5.自定义View、动画、传感器、广播注册未解绑;6.匿名内部类、线程持有页面引用。排查工具:AndroidStudioProfiler、LeakCanary、MAT分析hprof文件。通用修复思路:减少强引用、使用弱引用/软引用、页面销毁及时解绑、清空任务、释放资源、避免静态持有页面级对象。3.卡顿优化原理与实战方案参考答案:Android每16ms绘制一帧,主线程耗时超过16ms就会丢帧、产生卡顿。卡顿本质是主线程阻塞、耗时任务、UI绘制耗时。优化手段:1.主线程只做UI刷新,所有网络、IO、计算、数据解析全部放子线程;2.布局优化:减少嵌套、使用ConstraintLayout替代LinearLayout多层嵌套、减少不可见View的绘制、复用View;3.列表卡顿优化:RecyclerView复用、预加载、减少onBind耗时、避免在onBind中创建对象、图片异步加载;4.避免频繁invalidate、requestLayout,减少UI重绘重布局;5.使用卡顿监控工具(BlockCanary)捕获主线程堆栈,定位卡顿代码。4.图片优化全套方案参考答案:1.尺寸适配:根据ImageView大小加载对应尺寸图片,避免大图小用,缩放裁剪减少内存占用;2.格式优化:线上用webp、heic格式,替代png、jpg,压缩体积;3.内存缓存、磁盘缓存分级管理,淘汰过期缓存,控制缓存大小;4.列表滑动时暂停图片加载,滑动结束恢复加载,提升流畅度;5.禁止大图一次性加载,使用分片加载;6.回收无用Bitmap,及时recycle释放内存。三、开源框架与源码(高级核心)1.Retrofit+OkHttp核心原理,拦截器执行顺序参考答案:OkHttp核心:基于责任链模式,通过拦截器层层处理请求、响应,支持连接池、缓存、重试、超时控制。Retrofit核心:基于动态代理,将接口注解(GET/POST、参数、请求头)解析成Http请求,封装OkHttp,简化网络请求写法。拦截器执行顺序:自定义应用拦截器->OkHttp内置拦截器(重试、重定向)->桥接拦截器->缓存拦截器->连接拦截器->网络拦截器,响应结果反向回调。实战中自定义拦截器多用于统一加请求头、统一签名、日志打印、token过期拦截刷新。2.Glide缓存机制、生命周期原理参考答案:三级缓存:活动内存缓存(正在使用的图片)->LRU内存缓存(最近使用图片)->磁盘缓存。优先读内存缓存,没有再读磁盘缓存,最后网络请求;写入顺序相反。生命周期原理:Glide会绑定Activity/Fragment的生命周期,页面暂停时暂停图片加载,页面销毁时自动取消所有请求、释放资源,有效避免内存泄漏和无效请求,这也是Glide比普通图片框架更稳的核心原因。3.RecyclerView复用原理、卡顿优化、嵌套滑动解决方案参考答案:复用原理:通过ViewHolder缓存ItemView,将View和数据分离,滑动时复用屏幕外的Item,只更新数据,不重复inflate布局,减少IO和UI创建耗时。RecyclerView优化:1.固定item高度,避免频繁测量布局;2.减少onBindViewHolder耗时,不做耗时计算、不新建对象;3.DiffUtil局部刷新,替代notifyDataSetChanged全局刷新;4.预取、预加载优化,开启Item缓存。嵌套滑动冲突解决:1.利用NestedScrolling机制,父子RecyclerView嵌套滑动联动;2.自定义滑动拦截规则,根据滑动方向、滑动距离判断由谁消费事件;3.滑动过程中禁止父控件拦截事件,滑动结束恢复拦截。四、跨进程、组件与系统核心参考答案:Binder核心:Android跨进程通信核心机制,基于内存映射,一次拷贝,效率高;驱动层负责进程间数据中转,相比Socket、管道开销更低。跨进程方式对比:1.Bundle:简单数据、少量数据传递,Activity/Service跳转;2.广播:系统级通知、被动接收数据,不适合大量高频数据;4.Socket:网络跨进程,开销大,极少用于APP内跨进程。2.多进程优缺点、项目中多进程适配问题参考答案:优点:主进程崩溃不影响子进程、分散内存占用、规避单进程内存上限、独立任务运行。缺点:进程独立,静态变量、SharedPreferences、单例全部失效;Application会多次创建;数据不同步、资源重复初始化、内存占用变大。适配方案:1.Application中通过进程名区分,只在主进程初始化核心SDK;2.多进程数据共享用MMKV、Binder、文件,不用SP和静态变量;3.避免子进程重复初始化第三方库。3.View事件分发机制、滑动冲突彻底解决方案参考答案:事件分发流程:Activity->根View->父ViewGroup->子View核心三个方法:dispatchTouchEvent(分发)、onInterceptTouchEvent(拦截,仅ViewGroup有)、onTouchEvent(消费)。规则:父控件可以拦截事件,一旦拦截,子View无法收到事件;子View消费事件后,父控件不再处理。滑动冲突解决:1.外部拦截法(常用):父ViewGroup根据滑动方向、距离判断是否拦截,横向滑动父控件拦截,纵向子View拦截;2.内部拦截法:子View通过requestDisallowInterceptTouchEvent禁止父控件拦截,适配复杂嵌套场景。五、项目实战与面试加分题1.说说你项目中做过的性能优化,具体指标提升多少参考答案(实战话术,可直接复用):我在项目中主要做了启动、卡顿、内存、网络四个方向的优化:1.启动优化:梳理Application所有初始化任务,拆分同步/异步、延迟任务,用JetpackStartup统一调度,去除主线程冗余耗时,冷启动耗时从1.8s优化到0.9s;2.卡顿优化:通过BlockCanary捕获主线程卡顿堆栈,修复列表onBind耗时、频繁创建对象、主线程IO等问题,页面帧率从45帧提升到58帧左右;3.内存优化:修复Handler泄漏、单例持有页面引用、集合未清空等问题,页面重复打开内存峰值下降30%,崩溃率降低0.05%;4.网络优化:统一拦截器、重试机制、缓存策略,合并重复请求,弱网、异常场景适配,接口失败率下降明显。2.线上崩溃怎么排查?说说完整流程参考答案:1.收集日志:通过Bugly、Firebase、自研日志平台获取崩溃堆栈、机型、系统版本、操作路径、设备信息;2.定位类型:区分空指针、数组越界、子线程更新UI、ANR、内存溢出、系统兼容问题;3.复现问题:根据用户操作路径,针对性复现,无法复现就根据堆栈代码逻辑排查边界场景;4.修复优化:修复代码bug、增加空判断、捕获异常、规避系统兼容坑、优化耗时

温馨提示

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

评论

0/150

提交评论