android 常考 面试题 详解
Android 面试题详解2026 最新版一、初级篇基础必问1. Android 四大组件是什么分别有什么作用组件作用Activity负责界面展示和用户交互Service在后台执行耗时任务不提供界面BroadcastReceiver接收系统或应用发送的广播消息ContentProvider实现应用间的数据共享四大组件通过Intent建立联系构成 Android 应用的核心运行结构。2. Activity 的完整生命周期onCreate() → onStart() → onResume() → onPause() → onStop() → onDestroy() ↑_________________________↓ onRestart()关键场景A → BA 先onPause()B 启动后再 AonStop()按 Home 键onPause()→onStop()内存不足处于onStop()的 Activity 可能被系统回收Dialog 弹出不会触发生命周期回调非全屏遮挡3. Activity 的四种启动模式模式特点standard默认模式每次启动都创建新实例singleTop栈顶复用适合接收通知跳转的页面singleTask栈内复用清除其上方所有 ActivitysingleInstance独占一个任务栈使用极少4. Service 的两种启动方式方式特点startService()长期后台运行与调用者无绑定关系需手动 stopbindService()与调用者绑定支持进程内通信调用者销毁后自动解绑⚠️ Android 8.0 后后台启动服务受限推荐使用WorkManager处理可延迟后台任务。5. Handler 机制详解Handler 的核心是消息队列模型涉及四个角色Message消息 → MessageQueue消息队列 → Looper循环器 → Handler处理者工作流程线程调用Looper.prepare()创建 Looper 和 MessageQueueHandler 通过sendMessage()将 Message 加入队列Looper.loop()无限循环取出消息回调Handler.handleMessage()处理为什么不能在子线程直接更新 UIAndroid UI 控件非线程安全多线程同时修改会导致状态不一致。子线程更新 UI 需通过 Handler、runOnUiThread()、LiveData 或协程切主线程。6. 什么是 ANR如何避免ANRApplication Not Responding触发条件场景超时时间输入事件按键/触摸无响应5 秒BroadcastReceiver 处理超时10 秒前台/ 60 秒后台Service 执行超时20 秒避免方法耗时操作网络、数据库、文件 IO放到子线程使用协程、线程池、WorkManager 替代直接开线程减少主线程复杂计算7. 什么是内存泄漏常见场景内存泄漏 对象不再使用但仍被引用GC 无法回收。常见场景解决方案单例持有 Activity Context改用ApplicationContextHandler 持有外部 Activity 引用使用静态内部类 WeakReference匿名内部类/非静态内部类改为静态内部类注册监听后未反注册在onDestroy()中解绑静态集合持有页面对象及时清理或改用弱引用8. Serializable vs Parcelable对比SerializableParcelable来源Java 标准接口Android 专用实现方式反射手动实现读写性能慢快适用场景数据持久化组件间传递数据结论Android 组件间传输数据优先使用 Parcelable。二、中级篇进阶核心9. View 的绘制流程View 绘制三大流程onMeasure() → onLayout() → onDraw()方法作用onMeasure()测量 View 的宽高MeasureSpec封装了父 View 约束onLayout()确定子 View 的位置onDraw()绘制内容到 CanvasMeasureSpec 的三种模式EXACTLY精确值如match_parent或具体 dpAT_MOST最大值限制如wrap_contentUNSPECIFIED无限制如 ScrollView 内部10. 事件分发机制事件传递顺序Activity → ViewGroup → View三个核心方法方法作用dispatchTouchEvent()事件分发入口onInterceptTouchEvent()ViewGroup 专用是否拦截事件onTouchEvent()事件消费处理传递规则返回true事件被消费不再向下传递返回false事件回传给父 View 处理默认情况下View 的onTouchEvent()返回 true 表示消费事件11. 为什么主线程的 Looper.loop() 不会卡死Looper.loop()内部是一个for(;;)死循环但不会 ANR原因没有消息时阻塞MessageQueue.next()会调用nativePollOnce()进入休眠释放 CPU有消息时唤醒其他线程通过enqueueMessage()写入消息调用nativeWake()唤醒ANR 的本质是消息处理超时而非循环本身阻塞12. HTTP 1.0/1.1/2.0/3.0 演进版本核心特性HTTP 1.0短连接每次请求新建 TCPHTTP 1.1默认 Keep-Alive 长连接、管道化存在队头阻塞HTTP 2.0二进制分帧、多路复用、头部压缩HPACKHTTP 3.0 (QUIC)基于 UDP、零 RTT 建连、连接迁移Wi-Fi/4G 切换不断连13. HTTPS TLS 1.2 握手流程2 RTTClient Server │ ── Client Hello (TLS版本/加密套件/随机数C) ── │ │ ─ Server Hello (选定套件/随机数S/证书) ───── │ │ │ │ [客户端校验 CA 证书] │ │ ── Client Key Exchange (公钥加密 Pre-Master) │ │ │ │ [双方通过 随机数C 随机数S Pre-Master 生成主密钥] │ │ ── Client Finished (加密握手摘要) ────────── │ │ ─ Server Finished (加密握手摘要) ─────────── │ │ │ │ 使用对称密钥进行密文通信 │14. TCP 三次握手与四次挥手三次握手Client SYN1, seqx → Server Client ← SYN1, ACK1, seqy, ackx1 Server Client ACK1, seqx1, acky1 → Server四次挥手Client FIN1 → Server主动关闭 Client ← ACK1 Server确认 Client ← FIN1 Server数据发完被动关闭 Client ACK1 → Server进入 TIME_WAIT等待 2MSLTIME_WAIT作用确保 Server 收到最后一个 ACK防止旧连接数据包干扰新连接。15. 性能优化方向优化维度具体手段启动优化减少onCreate()负载、懒加载、SplashScreen API、异步初始化内存优化LeakCanary 检测泄漏、图片压缩Glide/Coil、避免内存泄漏绘制优化减少过度绘制、使用clipRect()、避免频繁invalidate()包体积优化资源混淆AndResGuard、移除无用资源、so 库按需打包网络优化合并请求、压缩数据、HTTPDNS、缓存策略三、高级篇源码与架构16. Binder 机制原理Binder 是 Android 特有的进程间通信IPC机制基于 Linux 的内存映射mmap实现。核心优势一次内存拷贝传统 IPC 需两次基于 C/S 架构安全性高通过 UID/PID 校验支持同步和异步调用核心角色IBinder接口定义Binder服务端实现BinderProxy客户端代理ServiceManagerBinder 服务的注册与查询中心17. AIDL 使用与原理AIDLAndroid Interface Definition Language用于定义跨进程接口。使用步骤定义.aidl接口文件编译后生成Stub服务端和Proxy客户端Service 中实现Stub的接口方法客户端通过bindService()获取Proxy调用远程方法18. MVC / MVP / MVVM / MVI 对比架构特点缺点MVCActivity 既当 View 又当 Controller职责混乱难以测试MVPPresenter 作为中间层View 和 Model 完全解耦Presenter 臃肿接口过多MVVMViewModel LiveData/DataBinding响应式编程DataBinding 调试困难MVI单向数据流State 集中管理学习成本高样板代码多现代推荐Jetpack 官方推荐MVVM ViewModel LiveData/StateFlow Repository 模式。19. Kotlin 协程核心概念概念说明suspend挂起函数可在不阻塞线程的情况下暂停执行launch启动新协程返回Jobasync/await启动并发任务返回DeferredDispatchers调度器Main主线程、IOIO 密集型、DefaultCPU 密集型withContext切换协程上下文viewModelScopeViewModel 绑定的协程作用域ViewModel 清除时自动取消协程 vs 线程协程是轻量级线程一个线程可运行多个协程协程挂起时不阻塞线程线程可执行其他协程结构化并发父子协程自动关联取消20. Jetpack Compose 核心概念概念说明Composable声明式 UI 函数重组Recomposition状态变化时自动重新执行 Composableremember在重组中保持状态内存中rememberSaveable配置变更如旋转屏幕后仍保持状态状态提升State Hoisting将状态移到调用方实现单向数据流SideEffect/LaunchedEffect处理副作用如启动协程、监听事件21. 热修复与插件化原理技术原理热修复在不发版的情况下修复线上 Bug。核心原理通过 ClassLoader 加载补丁 dex替换有问题的类/方法如 Tinker 的 dex 插桩、Sophix 的方法替换插件化将功能模块拆分为独立 APK动态加载。核心原理HookInstrumentation和ActivityThread绕过 AndroidManifest 校验22. LeakCanary 原理监听生命周期通过Application.registerActivityLifecycleCallbacks()监听 Activity/Fragment 的onDestroy()弱引用检测在对象销毁后使用WeakReference引用该对象触发 GC手动触发Runtime.getRuntime().gc()分析引用链若对象仍未回收使用Shark前身为 haha解析 hprof 文件找出 GC Root 到泄漏对象的引用链23. Glide 缓存机制Glide 采用三级缓存内存缓存LruResourceCache → 磁盘缓存DiskLruCache → 网络加载内存缓存ActiveResources正在使用的图片弱引用LruResourceCache最近最少使用算法缓存磁盘缓存策略Data缓存原始数据Resource缓存转换后的图片ALL两者都缓存NONE不缓存24. OkHttp 核心机制机制说明连接池ConnectionPool复用 TCP 连接默认最大空闲连接 5 个存活 5 分钟拦截器链Interceptor Chain责任链模式支持应用拦截器和网络拦截器缓存策略Cache基于 HTTP 缓存头Cache-Control、ETag、Last-ModifiedGZIP 压缩自动处理请求/响应的压缩HTTP/2 支持多路复用、头部压缩25. 系统启动流程从开机到 App 启动BootLoader → Linux Kernel → init 进程 ↓ Zygote 进程fork 系统服务 应用进程 ↓ SystemServer 进程启动 AMS、WMS、PMS 等核心服务 ↓ Launcher 应用显示桌面 ↓ 点击 App 图标 → AMS 通知 Zygote fork 新进程 → 加载 Application/Activity四、算法与设计模式高频高频算法题链表逆序、判断环、合并有序链表二叉树遍历前序/中序/后序/层序快速排序、归并排序、堆排序二分查找及变种LRU Cache 实现两数之和、最长无重复子串等 LeetCode 高频题常用设计模式模式Android 应用单例模式Application、SystemService观察者模式LiveData、BroadcastReceiver适配器模式RecyclerView.Adapter代理模式BinderProxy、动态代理Retrofit责任链模式OkHttp Interceptor、事件分发Builder 模式AlertDialog.Builder、Notification.Builder五、2026 面试趋势根据最新面试反馈2026 年 Android 面试重点正在变化架构思维 语法记忆能解释为什么选 MVVM 而非 MVIViewModel StateFlow 与 Redux 的取舍并发与状态管理Kotlin 协程、Flow、结构化并发是失败率最高的领域移动端系统设计设计离线优先应用冲突解决机制2亿 DAU 应用的图片加载管道推送通知可靠送达架构AI 辅助编程能力部分大厂面试允许使用 AI但要求候选人能识别并解释 AI 生成代码的潜在缺陷备考建议优先深入工作中用到的技术再根据自身短板针对性补充。源码阅读建议从Handler、Binder、OkHttp、Glide入手面试中性价比最高。