Android 开发核心面试题汇总
本文整理了 Android 开发岗位常见的面试知识点,涵盖 Java 基础、集合框架、多线程、虚拟机原理、Android 四大组件、Handler 机制、性能优化、Kotlin 特性、Flutter 架构以及算法与 Framework 底层等内容。旨在帮助开发者系统复习,提升技术深度。
一、Java 基础与核心机制
1. 抽象类与接口的区别
抽象类和接口都是用于实现代码复用和约束的机制,主要区别如下:
- 方法实现:抽象类可以提供成员方法的实现细节(非抽象方法),而接口在 Java 8 之前只能存在 public 抽象方法(Java 8+ 支持 default 和 static 方法)。
- 成员变量:抽象类中的成员变量可以是各种类型;接口中的成员变量只能是 public static final 类型的常量。
- 构造器:接口中不能含有构造器、静态代码块;抽象类可以有构造器和静态代码块。
- 继承关系:一个类只能继承一个抽象类,但可以实现多个接口。
- 访问速度:抽象类的访问速度通常比接口快,因为接口需要动态查找具体实现的方法(早期 JVM 优化差异)。
- 扩展性:向抽象类添加新方法时可提供默认实现,不影响现有子类;向接口添加方法则可能破坏所有实现类(除非使用 default 方法)。
- 设计意图:接口更多用于约束行为和解耦;抽象类侧重于代码复用和'是一个'的关系。
2. List、Set、Map 的区别
- List:有序集合,元素允许重复。常用实现有 ArrayList(基于数组,查询快插入慢)、LinkedList(基于链表,插入删除快)。
- Set:无序集合(HashSet),元素不允许重复。基于 HashMap 实现,利用 key 的唯一性保证元素唯一。
- Map:键值对存储,key 不允许重复,value 允许重复。HashMap 是常用的实现,基于哈希表,平均时间复杂度 O(1)。
3. 线程状态详解
Java 线程生命周期包含以下五种状态:
- 新建 (New):创建线程对象但未调用 start 方法。
- 就绪 (Runnable):调用了 start 方法,等待 CPU 调度。
- 运行 (Running):获得 CPU 时间片,执行 run() 方法。
- 阻塞 (Blocked):等待获取监视器锁或 I/O 操作暂停。
- 死亡 (Terminated):run() 方法结束或被 stop() 终止。
4. HTTP 与 HTTPS 的区别
- 安全性:HTTP 明文传输,不安全;HTTPS 基于 SSL/TLS 加密传输,保障数据隐私。
- 证书:HTTPS 需要 CA 机构颁发证书,部分免费证书可用,但商业证书需费用。
- 端口:HTTP 默认 80 端口,HTTPS 默认 443 端口。
- 连接方式:HTTP 无状态,连接简单;HTTPS 握手过程复杂,涉及密钥交换。
- Android 限制:Android 9.0+ 默认禁止 Cleartext Traffic,若需使用 HTTP 需在 Manifest 中设置
android:usesCleartextTraffic="true"。
二、Android 核心机制
1. Handler 消息机制原理
Handler 机制是 Android 跨线程通信的核心,主要由 Handler、MessageQueue、Looper 组成。
- Looper 准备:每个线程通过 Looper.prepare() 初始化 MessageQueue,Looper.loop() 开启死循环读取消息。
- 消息发送:Handler.sendMessage() 将消息插入 MessageQueue,按 when 时间排序。
- 消息处理:Looper 从队列取出消息,回调 Handler 的 handleMessage() 或 Runnable。
- 主线程:ActivityThread 启动时自动创建 Looper,确保 UI 更新在主线程进行。
2. Context 的理解与应用
Context 是应用上下文的抽象基类,提供资源访问和系统服务调用能力。
- 子类关系:Activity、Service、Application 均继承自 ContextImpl 或通过 ContextWrapper 包装。
- 内存泄漏风险:避免在非 Activity 场景下持有 Activity 的 Context 引用,推荐使用 ApplicationContext。
- 启动 Activity:非 Activity 的 Context 启动 Activity 需加 FLAG_ACTIVITY_NEW_TASK 标志。
- 应用场景:UI 操作必须使用 Activity Context;全局单例应使用 Application Context。
3. Activity 与 Fragment 通信
- ViewModel:使用 ViewModel 共享数据,配合 LiveData 或 StateFlow 实现单向数据流。
- 接口回调:Fragment 定义接口,Activity 实现并传递自身引用。
- EventBus:使用事件总线解耦,适合多层级通信。
- Bundle 传递:适用于简单数据传递,注意序列化问题。
三、Kotlin 语言特性
1. 空安全机制
Kotlin 引入可空类型和非空类型区分,编译器强制检查空指针。
val str: String? = null
// 安全调用符
val len = str?.length ?: 0
// Elvis 运算符
val result = str ?: "default"
2. 扩展函数
无需修改原类即可添加新功能。
fun String.addPrefix(prefix: String): String {
return prefix + this
}
3. Lambda 与高阶函数
支持闭包,简化回调逻辑。
list.filter { it > 0 }.map { it * 2 }
4. 协程 (Coroutines)
轻量级线程,解决回调地狱问题。
lifecycleScope.launch {
val data = withContext(Dispatchers.IO) { fetchData() }
updateUI(data)
}
四、Flutter 架构与生命周期
1. Widget 生命周期
- initState:初始化状态,此时 BuildContext 可用但布局未完全构建。
- didChangeDependencies:依赖变化时调用,如 InheritedWidget 更新。
- build:每次状态变化或依赖更新时重建 UI。
- dispose:销毁前清理资源,如 StreamController。
2. 线程模型
Dart 采用事件循环机制,包含 Microtask 队列和 Event Queue。Microtask 优先级更高,过多会导致 UI 卡顿。渲染分为 UI Runner、GPU Runner、IO Runner 等线程协同工作。
3. 异步编程
使用 Future 和 Stream 处理异步任务,compute 函数可在 Isolate 中执行耗时计算。
五、性能优化与 Framework
1. 启动优化
- 减少主线程耗时:延迟初始化非必要组件。
- 热启动:预加载关键资源,利用 Application 的 attachBaseContext 做准备工作。
- 冷启动:优化 APK 大小,减少 dex 加载时间。
2. 内存优化
- LeakCanary:检测内存泄漏。
- Bitmap 管理:按需加载,及时回收大图片。
- 监听 GC:监控堆内存使用情况。
3. Binder 与 IPC
Binder 是 Android 进程间通信的核心机制,支持 AIDL、Messenger 等方式。AMS (Activity Manager Service) 负责管理 Activity 生命周期和进程调度。
六、算法与数据结构
1. 常见算法题
- 二分查找:适用于有序数组,时间复杂度 O(log n)。
- 快速排序:分治思想,平均 O(n log n)。
- 动态规划:解决重叠子问题,如背包问题、最长公共子序列。
2. 数据结构应用
- HashMap:理解扩容机制和哈希冲突处理。
- ArrayList:了解扩容策略和随机访问优势。
- TreeMap:红黑树实现,支持范围查询。
七、企业高频面试题精选
1. 数据存储
- SP:适合存储少量配置数据,频繁读写可能导致文件 IO 瓶颈。
- Room:基于 SQLite 的 ORM 库,提供编译期 SQL 校验。
- DataStore:Google 推荐的新一代偏好存储方案,基于 Protobuf。
2. 网络层
- Retrofit:基于 OkHttp 的声明式 HTTP 客户端。
- OkHttp:连接池管理,拦截器链处理请求。
- WebSocket:全双工通信,适合实时推送场景。
3. 音视频基础
- 编码原理:通过去除冗余信息(空间/时间冗余)压缩视频体积。
- 直播优化:降低首屏时间,调整码率适应网络波动。
- 图像处理:直方图均衡化增强对比度,滤波降噪。
注:以上内容基于通用技术知识整理,实际面试中请结合具体项目经验作答。


