Android 大厂面试高频 174 问与核心知识点解析
本文整理了 Android 开发中常见的大厂面试题目,涵盖数据存储、组件生命周期、UI 布局、内存管理、网络通信及多线程等核心领域。旨在帮助开发者系统复习基础与进阶知识,提升技术深度。
一、数据存储与基础
1. SD 卡与数据持久化
- SD 卡:Android 系统中用于扩展存储的外部设备。现代 Android 版本(API 29+)对外部存储访问进行了严格限制(Scoped Storage),建议优先使用内部存储或应用私有目录。
- 数据存储方式:包括 SharedPreferences、文件存储、SQLite 数据库、ContentProvider 以及网络存储。SharedPreferences 适合轻量级配置;SQLite 适合结构化数据。
2. SharedPreferences (SP)
- 频繁操作后果:SP 基于 XML 文件,频繁读写会导致 I/O 阻塞,影响主线程性能。建议使用
apply()替代commit()进行异步写入。 - 存储容量:理论上无硬性限制,但受限于设备存储空间。通常建议仅存储少量配置信息,避免存储大对象。
3. 数据库与 SQLite
- SQLiteOpenHelper 方法:
getReadableDatabase()和getWritableDatabase()均会调用onCreate()或onUpgrade()。数据库文件默认存放在/data/data/<package_name>/databases/。 - 发布带数据的 SQLite:可将预置数据库文件放入
assets目录,在首次运行时复制到databases目录。 - 表复制:可通过 SQL 语句
INSERT INTO table2 SELECT * FROM table1;实现结构与数据迁移。
二、Activity 与组件生命周期
1. Activity 生命周期
- 状态:Created, Started, Resumed, Paused, Stopped, Destroyed。
- 横竖屏切换:默认会销毁重建。可通过设置
android:configChanges="orientation|screenSize"拦截配置变更,在onConfigurationChanged()中处理。 - 启动方式:显式 Intent、隐式 Intent、PendingIntent、AIDL 跨进程调用。
2. Application 与 Activity
- Application 启动 Activity:Application 本身不是 Context 的子类,不能直接启动 Activity。需通过
ContextWrapper或获取 ApplicationContext 后调用startActivity(),但需注意权限和任务栈问题。
3. Service 机制
- 生命周期:
onCreate(),onStartCommand(),onBind(),onUnbind(),onDestroy()。 - 返回值:
START_STICKY,START_NOT_STICKY,START_REDELIVER_INTENT。 - onRebind:当所有客户端解绑且
onUnbind()返回 true 时执行。 - 启动方式:
startService()(后台运行),bindService()(绑定交互)。
4. Broadcast & ContentProvider
- 接收广播:静态注册(Manifest)或动态注册(Receiver)。注意动态注册需在合适时机注销以防内存泄漏。
- 拦截休眠唤醒:监听
ACTION_SCREEN_ON和ACTION_SCREEN_OFF广播。 - 短信内容:需动态请求
READ_SMS权限,监听SMS_RECEIVED广播。 - 通话记录:URI 为
ContactsContract.Call.CONTENT_URI,需READ_CALL_LOG权限。
三、Fragment 与 UI 布局
1. Fragment 生命周期
- 关键回调:
onAttach(),onCreate(),onCreateView(),onActivityCreated(),onResume(),onPause(),onDestroyView(),onDestroy()。 - 横竖屏数据保存:使用
setRetainInstance(true)或在onSaveInstanceState()中保存数据。
2. Fragment 与 Activity 交互
- 传值:通过
Bundle参数传递,或使用ViewModel共享数据。 - Activity 栈管理:FragmentTransaction 的
addToBackStack()可管理回退栈。
3. View 与 Layout
- add vs replace:
add保留旧实例,replace移除旧实例并添加新实例。 - 事件分发:
dispatchTouchEvent->onInterceptTouchEvent->onTouchEvent。父容器可拦截事件。 - 布局优化:减少嵌套层级,使用
merge标签,使用include复用布局,使用ConstraintLayout扁平化结构。 - 权重与重力:
layout_weight用于分配剩余空间;gravity控制子元素在容器内的位置;layout_gravity控制子元素相对于容器的位置。
4. 图片与资源
- DP 与 PX:
dp是密度无关像素,px是物理像素。转换公式:px = dp * (dpi / 160)。 - 图像显示:使用
ImageView加载,注意内存优化(如使用 Glide/Picasso 库)。 - 透明度与旋转:通过
alpha属性或Matrix变换实现。
四、内存管理与性能优化
1. 内存泄露
- Handler:非静态内部类持有 Activity 引用导致泄露。应使用静态 Handler + WeakReference 或
postDelayed清理。 - 单例:全局单例若持有 Context 可能泄露,应使用 Application Context。
- Bitmap:大图片未回收导致 OOM。使用
inSampleSize压缩,及时调用recycle()。
2. OOM 排查
- SoftReference vs WeakReference:SoftReference 在内存不足时可被 GC 回收;WeakReference 随时可能被回收。
- ANR 规避:耗时操作移至子线程,避免主线程阻塞超过 5 秒。
3. JVM 与 ART
- DVM 与 JVM:Dalvik 虚拟机针对移动设备优化,使用寄存器架构;JVM 标准 Java 虚拟机,使用栈架构。
- GC 算法:标记 - 清除、复制、标记 - 整理。ART 采用分代收集(Young/Old Gen)。
- 可达性分析:GC Roots 包括栈帧中的局部变量、静态属性、常量引用等。
五、多线程与并发
1. Handler 机制
- 原理:MessageQueue 队列 + Looper 循环 + Handler 发送消息。Handler 依赖 ThreadLocal 获取当前线程 Looper。
- 内存泄露:Handler 持有外部类引用,需使用弱引用或静态内部类。
2. 线程池
- ThreadPoolExecutor:核心参数包括 corePoolSize, maximumPoolSize, keepAliveTime, workQueue, threadFactory, handler。
- ThreadLocal:提供线程隔离变量,常用于存储 User 信息或 Database Connection。
3. 锁与同步
- Lock 同步:ReentrantLock 比 synchronized 更灵活,支持公平锁、条件变量。
- Semaphore:信号量,控制同时访问资源的线程数量。
- CountDownLatch:等待一组线程完成后再继续执行。
六、网络与通信
1. HTTP 与 OkHttp
- 连接建立:DNS 解析 -> TCP 握手 -> SSL 握手(HTTPS)-> 发送请求 -> 接收响应。
- OkHttp:支持连接池、缓存、拦截器链。推荐使用 Retrofit 封装。
2. Binder 与 IPC
- Binder:Android 特有的 IPC 机制,基于 C++ 实现,支持透传对象。
- AIDL:Android Interface Definition Language,用于定义接口进行跨进程通信。
3. 蓝牙与电话
- 蓝牙状态:STATE_OFF, STATE_TURNING_ON, STATE_ON, STATE_TURNING_OFF。
- 蓝牙设备:通过
BluetoothAdapter.getBondedDevices()获取已配对设备。
七、高级主题与源码
1. 自定义 View
- 流程:Measure -> Layout -> Draw。重写
onMeasure,onLayout,onDraw。 - ViewGroup:需处理子 View 的测量与布局逻辑。
2. 动画
- 补间动画:Alpha, Scale, Translate, Rotate。
- 属性动画:ObjectAnimator,可作用于任意对象属性,性能优于补间动画。
3. 数据结构
- HashMap vs HashTable:HashMap 非线程安全,允许 null;HashTable 线程安全,不允许 null。
- 红黑树:自平衡二叉查找树,保证插入删除查询复杂度为 O(log n)。
- LRU Cache:最近最少使用缓存策略,结合 LinkedHashMap 实现。
4. 其他关键点
- volatile:保证可见性与禁止指令重排,不保证原子性。
- 单例模式:双重检查锁(DCL)防止多线程创建多个实例。
- 反射:EventBus 常用反射机制实现订阅者通知。
八、总结
Android 面试不仅考察 API 的使用,更强调底层原理的理解。建议重点掌握 Activity 生命周期、内存优化、多线程模型及网络协议。通过系统化的题库练习与源码阅读,可有效提升技术竞争力。


