尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Android 常考面试题详解:从四大组件到性能优化,一篇吃透
一、前言Android 面试考什么Android 面试的经典结构是Java/Kotlin 基础 → Android 四大组件 → 消息机制 → View 体系 → 性能优化 → 项目深挖。其中 Android 特有的部分集中在中间三块也是本文重点。以下 25 道高频题按模块整理每题给出标准答案 追问点背熟能覆盖 80% 的一二面。二、四大组件Q1Activity 的生命周期异常情况呢标准答案正常启动onCreate → onStart → onResume 退到后台onPause → onStop 回到前台onRestart → onStart → onResume 销毁 onPause → onStop → onDestroy异常生命周期横竖屏切换Activity 被销毁重建走onPause → onStop → onSaveInstanceState → onDestroy → onCreate → onStart → onRestoreInstanceState → onResume。数据保存在onSaveInstanceState(Bundle)里存临时数据onCreate/onRestoreInstanceState里恢复。追问点onPause 里能做耗时操作吗——不能新 Activity 的 onResume 要等上一个 onPause 执行完应用层如此卡这里会掉帧。Q2Activity 的四种启动模式模式行为典型场景standard每次新建实例入栈默认singleTop栈顶存在则复用走 onNewIntent推送详情页防连点开 N 个singleTask栈内存在则清其上所有 Activity主页singleInstance独占一个任务栈通话、来电页追问点singleTask 不同任务栈taskAffinity的行为onNewIntent 生命周期顺序onNewIntent → onRestart → onStart → onResume。Q3Service 的 startService 和 bindService 区别维度startServicebindService生命周期onCreate → onStartCommand需主动 stopSelf/stopServiceonCreate → onBind → onUnbind → onDestroy与调用者关系无关联调用者销毁 Service 还活着绑定共存亡可拿到 IBinder 通信用途后台下载、播放与 Activity 交互如音乐进度条追问点Android 8.0 后台 Service 限制 → 前台服务startForeground 通知保活为什么靠 Service 靠不住。Q4广播的有序广播和无序广播普通广播sendBroadcast异步所有接收者几乎同时收到不可拦截。有序广播sendOrderedBroadcast按优先级依次传递可abortBroadcast()截断、可修改结果。本地广播LocalBroadcastManager仅应用内安全高效官方已废弃推荐用 EventBus/Flow 替代。追问点静态注册广播在 Android 8.0 后的限制大部分系统广播只允许动态注册。Q5ContentProvider 的作用跨进程数据共享的标准方案。底层基于Binder通过 URI 定位数据content://com.app.provider/user/1。追问点为什么启动 App 时 ContentProvider 的 onCreate 先于 Application.onCreateinitOrder 里 installContentProviders 先执行——高频冷门题。三、消息机制Handler 必考五连Q6Handler 的完整工作原理标准答案必须按链路背Handler.sendMessage(msg) → MessageQueue.enqueueMessage(msg, when) 消息入队按时间排序 → Looper.loop() 死循环取消息 主线程早有 Looper → msg.target.dispatchMessage(msg) 分发给 Handler → handleMessage(msg) 处理角色分工角色职责一句话Handler发送和处理消息邮递员Message消息载体含 what/obj/when/target信件MessageQueue按时间排序的优先级队列信箱Looper死循环取消息驱动分发邮局分拣员ThreadLocal每个线程存自己的 Looper工牌Q7主线程为什么不会因为 Looper.loop() 死循环卡死高频难题。答案分三层主线程本来就该常驻——死循环是有活干活、没活休眠epoll 机制MessageQueue 的next()里 nativePollOnce 阻塞时不消耗 CPU不是忙等。卡 ANR 的是消息处理慢不是循环本身——ANR 是某条消息如 input 事件5 秒没处理完。整个 App 生命周期都跑在这个循环里——Activity 的 onCreate 都是被这个循环调度的一条消息。Q8Message.obtain() 为什么要复用怎么复用Message 内部维护一个链表池sPoolobtain() 优先从池里取recycle()时清空数据挂回池头。避免高频发消息时大量创建对象触发 GC 抖动。追问点为什么 Message 最大缓存 50 个MAX_POOL_SIZEView 的滑动消息同理用 obtain。Q9Handler 导致内存泄漏的原因和解决原因非静态内部类 Handler 隐式持有 ActivityMessage 未处理时被 MessageQueue 持有 → Message → Handler → ActivityActivity 销毁了却无法回收。解决Handler 声明为static classWeakReferenceActivityonDestroy里handler.removeCallbacksAndMessages(null)Q10IdleHandler 是什么MessageQueue 空闲时的回调addIdleHandler。用过的场景延迟初始化非紧急任务如日志上报等主线程不忙了再干。追问点ViewRootImpl 的首次绘制就依赖 IdleHandler等消息队列空了再 measure/layout。四、View 体系Q11View 的绘制流程标准答案ViewRootImpl.performTraversals() ├── performMeasure() → onMeasure() 测量确定 View 大小MeasureSpec ├── performLayout() → onLayout() 布局确定 View 位置 └── performDraw() → onDraw() 绘制画到屏幕CanvasMeasureSpec 三种模式模式含义对应EXACTLY确定大小match_parent / 固定 dpAT_MOST最大不超过wrap_contentUNSPECIFIED不限制ScrollView 对子 View追问点自定义 View 时 wrap_content 为什么和 match_parent 一样——onMeasure 默认实现不处理 AT_MOST要自己 setMeasuredDimension。Q12事件分发机制标准答案经典 U 型图Activity → Window → DecorView → ViewGroup → ... → View 三个核心方法 dispatchTouchEvent() 分发 onInterceptTouchEvent() 拦截仅 ViewGroup 有 onTouchEvent() 消费父拦截子收不到onInterceptTouchEvent 返回 true → 子 View 收 ACTION_DOWN 之后的系列事件 → 事件交给父的 onTouchEvent子处理了父就不处理子 onTouchEvent 返回 true 消费 → 父不再收 MOVE/UP请求父不拦截requestDisallowInterceptTouchEvent(true)子 View 在 DOWN 后调用滑动冲突外部拦截法父改 onInterceptTouchEvent 判断方向/ 内部拦截法子 disallowQ13requestLayout / invalidate / postInvalidate 区别方法作用范围触发线程requestLayout从当前节点向上到 ViewRootImplmeasure layout draw可任意最终排到主线程invalidate只重绘当前 View只 drawonDraw必须主线程postInvalidate同 invalidate只 draw可子线程五、性能优化Q14内存泄漏的常见场景和排查高频泄漏场景背 6 个非静态内部类 Handler / Thread / AsyncTask 持有 Activity单例持有 Context应持 ApplicationContext广播 / EventBus / 回调没反注册WebView 未销毁新开进程 手动 onDestroy静态变量持有 View / Bitmap匿名内部类编译后持有外部引用排查工具LeakCanary开发期自动抓→ Memory Profiler → MAT 分析 hprof看 GC Root 引用链。Q15卡顿的排查思路定位Perfetto / Systrace 抓帧 → 找掉帧的帧 归因看主线程在干什么 ├── 主线程做 IO读 SP / 数据库→ 移到子线程 / MMKV ├── 主线程做复杂布局 → 降层级ConstraintLayout / merge / ViewStub ├── 过度绘制 → 开发者选项检查红色区域优化 └── 频繁 GC → 内存抖动找循环里创建对象的地方关键指标帧耗时 16ms60Hz/ 8.3ms120HzVitals 的 ANR 率 0.47%、崩溃率 1%。Q16Bitmap 优化怎么做采样压缩inSampleSize按目标尺寸算先 inJustDecodeBounds 只读尺寸格式ARGB_8888 → RGB_565无透明需求内存减半硬件位图inPreferredConfig HARDWARE像素存 GPU 显存不占 Java 堆及时回收Android 8.0 后 Bitmap 像素存 native 堆NativeAllocationRegistry 自动回收老版本手动 recycleQ17APK 包体积优化资源图片转 WebP、无用在 R8/资源混淆AndResGuard压缩、按密度分包代码R8 混淆裁剪minifyEnabled shrinkResourcessoabiFilters 只留 armeabi-v7a / arm64-v8a或按 ABI 分包动态交付App BundlePlay按需下载六、Kotlin / 协程 / 新技术Q18协程和线程的区别Android 场景用户态轻量级线程挂起不阻塞线程、创建成本几十字节、结构化并发防泄漏。Android 标配用法viewModelScope.launch{valuserwithContext(Dispatchers.IO){api.fetchUser()}updateUi(user)// 自动回主线程}追问点suspend 原理状态机launch vs asyncviewModelScope 为什么安全Activity 旋转销毁自动取消。Q19Flow 和 LiveData 的区别维度LiveDataFlow生命周期感知✅ 内置需 repeatOnLifecycle 包一层操作符少map/switchMap丰富debounce/filter/combine…数据流类型值持有冷流/热流跨层使用仅 UI 层数据层/领域层通用结论新项目 UI 状态用StateFlow数据流处理用 FlowLiveData 只在老项目维护。Q20Jetpack MVVM 的完整数据流ViewActivity/Fragment ↕ 观察 StateFlow / LiveData ViewModel持有 UI 状态不持 Context ↕ 调用 Repository单一数据源原则 ↙ ↘ Room本地缓存 Retrofit网络核心原则数据单向流动UDF、单一数据源SSOT、ViewModel 不持有任何 Context。七、冷门但常问Q21Android 的进程优先级前台进程 可见进程 服务进程 缓存进程后台 LRU系统按优先级从低到高杀内存。追问点为什么保活越来越难厂商白名单 Doze 模式 App Standby正路是把进程做轻。Q22Binder 是什么为什么选它而不是 SocketAndroid 跨进程通信的底层机制。选 Binder 因为一次拷贝mmap 内存映射Socket/管道要两次、C/S 架构易用、进程 ID 校验安全性好。追问点AIDL 是 Binder 的封装四大组件的跨进程全靠 Binder。Q23SPSharedPreferences为什么慢替代品SP 首次加载同步读文件 全量解析 XML到内存主线程 wait写入 commit 同步、apply 虽异步但QueuedWork可能阻塞。替代MMKVmmap protobuf腾讯、DataStoreKotlin Flow官方推荐。Q24View.post 为什么能拿到 View 宽高post 的 Runnable 排进消息队列执行时机在ViewRootImpl 的 performTraversals绘制之后——View 测量完了自然有宽高。Q25为什么 onActivityCreated 被废弃了Fragment 通信怎么做废弃是推动用viewLifecycleOwner观察数据。现代通信方式ViewModel 共享同一 FragmentManager scope 接口回调 Result API。八、总结面试复习路线第一梯队必背生命周期 / 启动模式 / Handler 五连 / 事件分发 / 绘制流程 第二梯队加分性能优化实战案例 / Binder / 协程 Flow / MVVM 数据流 第三梯队亮点冷启动优化 / 包体积 / 线上监控APM/ 跨进程方案选型最重要的一条建议背完标准答案后一定要准备一个自己项目里的真实案例。比如我们 App 启动 3s → 1.2s的优化过程比 25 道八股更能让面试官记住你——八股筛人案例定薪。参考资料《Android 开发艺术探索》任玉刚四大组件 View 体系《Android 进阶解密》刘望舒消息机制 BinderGoogle 官方文档developer.android.comJetpack / 性能Android 性能优化官方课Measuring Improving App Performance
RELATED

相关推荐

【电子科技大学主办 | 成都举办】第十届电气、机械与计算机工程国际学术会议(ICEMCE 2026)

【电子科技大学主办 | 成都举办】第十届电气、机械与计算机工程国际学术会议(ICEMCE 2026)

第十届电气、机械与计算机工程国际学术会议(ICEMCE 2026) 2026 10th International Conference on Electrical, Mechanical and Computer Engineering 随着新一轮科技革命和产业变革的不断深入,电气、机械与计算机工程正加速融合发展&#…

📅 2026/9/9 1:34:39
ARM ABI规范全景解析:从arm-software/abi-aa仓库到编译器后端落地

ARM ABI规范全景解析:从arm-software/abi-aa仓库到编译器后端落地

做交叉编译这些年,我有个根深蒂固的习惯:只要遇到“函数调用传参传得好好的,一优化就炸”这类问题,第一反应不是去翻优化选项,而是去查编译器到底按哪一套 ABI 来生成代码。ABI 全称 Application Binary Interface&…

📅 2026/9/9 1:29:39
Delphi中使用PDFium转位图黑图问题根因与Winsoft组件接入实践

Delphi中使用PDFium转位图黑图问题根因与Winsoft组件接入实践

简介:面向Delphi/C Builder 5-10.3及Lazarus 2.0.6开发者的PDF处理组件套件,基于PDFium开源渲染引擎,提供PDF查看、导航、文本提取与编辑功能,可用于文档管理、电子签章、票据解析及批量导出等桌面应用场景,适合需要快…

📅 2026/9/9 1:29:39
MORE NEWS

更多资讯

📰

语言第一悖论:为什么所有解释都在原地打转,以及如何破局

朋友突然问我:“什么是自由?”我几乎脱口而出:“自由就是想干嘛就干嘛。”他紧接着追问:“那什么叫想干嘛就干嘛?”我说:“就是不受约束。”他继续问:“不受约束又是啥?”我张了张嘴…

📰

Rust Web框架ruflo:轻量扁平化设计,从零搭建高效API服务

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

📰

FANUC屏幕显示功能从原理到实操:定制画面与故障排查指南

简介:面向FANUC数控系统操作、维护与电气调试人员,本资源聚焦数控机床双屏显示功能,解决加工中无法同时兼顾运行状态、程序编辑与诊断信息的问题。利用两个独立显示器,可在一个屏幕实时监控加工过程,在另一屏幕预览或编…

📰

C#上位机视觉开发:EmguCV摄像头取图与图像处理完整指南

简介:这是一份面向C#初学者的EmguCV摄像头开发示例包,演示如何调用EmguCV打开本地摄像头并提取图像,适合正在学习计算机视觉或需要快速搭建视频采集功能的.NET开发者参考。压缩包共41个文件,约39.31MB,内含5个C#源码文…

📰

VS Code AI Chat生态实测:Copilot、本地大模型与Agent工具选型指南

最近把VS Code更新到最新版,顺手点开侧边栏的Chat面板,我突然意识到这玩意儿已经不是我印象里那个只能陪聊几句的玩具了。从GitHub Copilot Chat到各种接入本地大模型的插件,再到Claude Code这类能自动改文件的Agent工具,VS Code的…

📰

SpringBoot+Vue+MyBatis学生成绩分析与弱项辅助系统完整拆解

成绩分析系统的开发并不复杂,真正难的是把“分析结果”转化成可执行的学习建议。SpringBoot Vue MyBatis 这套组合,几乎是国内中小型管理系统的标配,但很多人做出来的东西要么停留在“增删改查”层面,要么图表堆了一堆却不知道数…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬