Android面试题合集:高频问题与深度解析
以下精选Android开发核心面试题,涵盖系统原理、性能优化、架构设计等关键领域。每个问题附深度解析与技术要点,帮助系统化掌握知识体系(注:实际合集含100题,此处展示典型范例)。
一、核心组件与生命周期
问题1:Activity生命周期完整流程?
解析:
- 核心流程:
onCreate()→onStart()→onResume()(可见可交互) →onPause()(部分遮挡) →onStop()(完全不可见) →onDestroy()。 - 特殊场景:
- 屏幕旋转:触发
onSaveInstanceState()保存数据,重建时通过onRestoreInstanceState()恢复。 - 后台回收:系统可能销毁Activity,需用
Bundle持久化关键数据。
- 屏幕旋转:触发
- 考点:
onPause()中必须轻量操作(如释放摄像头),避免阻塞新Activity启动。
二、多线程与性能优化
问题2:Handler机制如何避免内存泄漏?
解析:
- 泄漏原因:Handler持有Activity引用,消息未处理完时Activity无法回收。
- 解决方案:
- 静态内部类+弱引用:
private static class SafeHandler extends Handler { private final WeakReference<Activity> mActivityRef; SafeHandler(Activity activity) { mActivityRef = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { Activity activity = mActivityRef.get(); if (activity != null) { /* 操作UI */ } } } - 生命周期同步:在
onDestroy()中调用removeCallbacksAndMessages(null)清除消息队列。
- 静态内部类+弱引用:
- 延伸考点:Looper死循环为何不阻塞主线程?因Linux的
epoll机制空闲时释放CPU。
三、Jetpack与架构设计
问题3:ViewModel为何能保存配置变更时的数据?
解析:
- 底层原理:
- ViewModel由
ViewModelStore管理,其生命周期与ComponentActivity关联。 - 配置变更时Activity重建,但
ViewModelStore通过NonConfigurationInstances保留。
- ViewModel由
- 数据安全:
- 内存存储:数据存于RAM,进程终止时失效(需配合
SavedStateHandle持久化)。 - 作用域隔离:同一Activity的多个Fragment共享ViewModel实例(通过
by activityViewModels())。
- 内存存储:数据存于RAM,进程终止时失效(需配合
- 最佳实践:ViewModel仅处理UI逻辑,避免直接操作View。
四、系统底层机制
问题4:Binder通信相比传统IPC的优势?
解析:
- 性能对比:
通信方式 数据拷贝次数 安全性 Binder 1次(内存映射) 身份校验完善 Socket 2次 依赖协议加密 - 技术要点:
- 内存映射:
mmap()将内核缓冲区映射到用户空间,避免用户态→内核态拷贝。 - 线程管理:Binder线程池自动管理并发(默认16线程),Socket需手动维护。
- 内存映射:
- 典型应用:AMS(ActivityManagerService)、WMS等核心服务均基于Binder。
五、高频算法题(Android场景)
问题5:实现LRU缓存淘汰策略
解析:
- 数据结构选择:双向链表(快速增删) + HashMap($O(1)$访问)
- Java实现:
class LRUCache { class Node { int key; int val; Node prev; Node next; } private Map<Integer, Node> cache = new HashMap<>(); private Node head, tail; private int capacity; public void put(int key, int value) { if (cache.containsKey(key)) remove(cache.get(key)); Node newNode = new Node(key, value); addToHead(newNode); cache.put(key, newNode); if (cache.size() > capacity) { cache.remove(tail.key); remove(tail); } } // 链表操作方法 addToHead(), remove() 略 } - 考点延伸:LinkedHashMap已内置LRU支持(
accessOrder=true+重写removeEldestEntry())。
合集内容结构
- 基础篇:组件/生命周期/UI绘制(25题)
- 进阶篇:性能优化/内存管理/JNI(30题)
- 架构篇:MVVM/MVI/模块化(20题)
- 系统篇:Binder/AMS/WMS(15题)
- 算法篇:数据结构+场景题(10题)
提示:深度解析需结合Android源码(如AOSP)、Profilers工具链及设计模式,建议通过实战项目强化理解。完整版可提供PDF及配套代码仓库链接。

1079

被折叠的 条评论
为什么被折叠?



