资讯动态

Android 常考面试题详解:从四大组件到性能优化,一篇吃透

发布时间:2026/9/9 1:34:39 来源:尧图企业网站定制
一、前言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

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价