Android 开发工程师 70 道核心技术面试题整理与解析
前言
本文整理了 Android 开发中常见的 70 道技术面试题,涵盖 Activity、Service、Broadcast、Handler、View 绘制等核心模块。旨在帮助开发者梳理知识体系,应对面试中的技术考察。
正文:技术面试题
1. Activity 生命周期?
标准流程为:onCreate() -> onStart() -> onResume() -> onPause() -> onStop() -> onDestroy()。
注意:从前台切换到后台可能只经历 onPause/onStop,返回前台则经历 onResume/onStart。
2. Service 生命周期?
Service 启动方式有两种:
- startService():生命周期为
onCreate() -> onStartCommand() -> onDestroy()。多次调用 startService 只会执行一次 onCreate,但 onStartCommand 会多次执行。需判断 Intent 是否为 null。
- bindService():生命周期为
onCreate() -> onBind() -> onUnbind() -> onDestroy()。适合需要交互的场景,通过 ServiceConnection 获取 Binder 对象调用方法。
混合使用时,当所有客户端解绑且服务未启动时才会销毁。
3. Activity 的启动过程(不要回答生命周期)
- 点击图标或 startActivity 触发系统调用
ActivityManagerService (AMS)。
- AMS 检查权限和组件配置,创建 ActivityRecord。
- 通知 ApplicationThread 启动 Activity。
- 主线程 Handler 发送消息,调用
handleLaunchActivity。
- 最终调用 Activity 的生命周期方法。
4. Broadcast 注册方式与区别
- 静态注册:在 AndroidManifest.xml 中注册。不受页面生命周期影响,可开机自启,但占用资源,优先级较低。
- 动态注册:代码中 registerReceiver。受生命周期影响,退出后失效,不泄露内存风险低,优先级较高,需手动 unregister。
广播分为有序和无序广播。
5. HttpClient 与 HttpUrlConnection 的区别
- HttpClient:API 丰富但较重,Android 6.0 已弃用。
- HttpUrlConnection:轻量级,基于流,支持 HTTPS/IPv6,Google 推荐。Volley 框架 2.3 后改用 HttpUrlConnection。
6. 讲解一下 Context
Context 是上下文环境抽象基类。
- 子类:ContextWrapper(封装), ContextImpl(实现)。
- 类型:Application, Activity, Service。
- 场景:启动 Activity 或弹出 Dialog 必须使用 Activity 类型的 Context,否则报错。其他场景通常通用。
- 数量:Context 数量 = Activity 数量 + Service 数量 + 1(Application)。
7. 理解 Activity, View, Window 三者关系
- Activity:控制单元,负责管理窗口和事件。
- Window:承载模型,PhoneWindow 是具体实现,包含 DecorView。
- View:显示视图,被添加到 Window 中。
- 关系:Activity 初始化 PhoneWindow,Window 持有 ViewRoot,通过 addView 添加子 View,事件由 WindowManagerService 分发回调给 Activity。
8. 保存 Activity 状态
onSaveInstanceState(Bundle) 在 onStop() 之前调用,用于保存临时数据。onRestoreInstanceState() 在 onStart() 之后调用恢复数据。
9. Android 中的几种动画
- 帧动画:顺序播放图片序列。
- 补间动画:Alpha, Scale, Translate, Rotate。仅改变视觉,不改变属性值。
- 属性动画:Property Animation。真正改变 View 属性,支持插值器,Android 3.0+ 支持。
10. Android 中跨进程通讯的几种方式
- Intent:传递 URI 或 Parcelable/Serializable 数据。
- ContentProvider:数据共享机制。
- Service:AIDL 远程服务调用。
- Messenger:基于 Handler 的消息机制。
- Socket:网络通信。
其他 Android 面试题详解
Activity 相关
- onSaveInstanceState/onRestoreInstanceState 时机:前者在 activity 转入后台前,后者在重建后恢复数据。
- Activity 启动模式:standard, singleTop, singleTask, singleInstance。用于控制任务栈行为。
- A 跳转 B 再返回生命周期:A(onPause)->B(onCreate->onStart->onResume)->B(onPause)->A(onResume)->B(onDestroy)
- 横竖屏切换等生命周期变化:涉及配置变更重启,会重新走 onCreate->onStart->onResume。
- onStart vs onResume:onStart 可见但未交互,onResume 可交互。
- Activity 传数据限制:Intent 有大小限制(约 1MB),大数据建议用 FileProvider 或 ContentProvider。
- onNewIntent 执行时机:singleTop 模式下,新 Intent 到达时触发。
- 显式与隐式启动:显式指定类名,隐式通过 Action/Category/MIME 匹配。
- Scheme 使用:唤起 App 或跳转特定页面,格式 scheme://host/path。
- ANR 四种场景:InputEvent 处理超时 5s,Broadcast 超时 10s,Service 超时 20s,ContentProvider 超时 20s。
- onCreate vs onRestoreInstanceState:onCreate 恢复 Bundle 数据,onRestoreInstanceState 专门恢复 UI 状态。
- Activity 间传递数据:Intent putExtra, Bundle, Serializable, Parcelable。
- 跨 App 启动 Activity:需导出 Activity 并配置 IntentFilter。
- Activity 任务栈:LIFO 结构,记录 Activity 实例。
- Flags 标记位:FLAG_ACTIVITY_NEW_TASK, FLAG_ACTIVITY_CLEAR_TOP 等。
- Activity 数据保存与恢复: onSaveInstanceState 保存临时状态,SharedPreferences/DB 保存持久数据。
Service 相关
- Service 与 Activity 通信:Binder, Messenger, AIDL。
- IntentService:继承 Service,自动创建工作线程处理 Intent,完成后自动停止。
- onStartCommand 返回值:START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT。
- bindService 和 startService 混合:先 start 后 bind,unbind 后若未 stop 仍运行,需单独 stopSelf。
BroadcastReceiver 相关
- 广播分类:系统广播、应用广播、自定义广播。
- 注册方式区别:静态常驻,动态按需。
- 原理:AMS 接收广播,分发给注册的 Receiver。
- 本地与全局广播:LocalBroadcastManager 仅限应用内,安全高效;全局广播可跨应用。
ContentProvider 相关
- 是什么:数据共享接口,提供统一访问方式。
- 关系:ContentResolver 操作,ContentObserver 监听。
- 原理:IPC 机制,通过 URI 映射到数据库或文件。
- 优点:解耦,安全,统一接口。
- Uri:统一资源标识符,格式 content://authority/path/id。
Handler 相关
- 原理:MessageQueue + Looper + Handler。Handler 发消息,Looper 循环取消息,Callback 处理。
- 子线程 new Handler:需先 Looper.prepare(),否则抛异常。
- 内存泄露:非静态内部类持有 Activity 引用,使用 WeakReference 或静态类。
- 线程与对象:一个线程一个 Looper,一个 MessageQueue,多个 Handler 共享队列。
- Message 创建:obtain(), new Message()。
- 发送方法:sendMessage, post, sendMessageDelayed, sendEmptyMessage。
- post vs sendMessage:post 直接绑定 Runnable,sendMessage 绑定 Message。
- delay 消息处理:按时间戳排序插入队列。
- 数据结构:单向链表。
- ThreadLocal:存储 Looper 实例,保证单例。
- HandlerThread:带 Looper 的子线程,用于后台异步任务。
- IdleHandler:消息队列为空时执行,常用于延迟任务。
- 屏障机制:同步屏障跳过异步消息,优先处理同步消息。
- 子线程更新 UI:禁止,会导致崩溃。
- 不建议原因:UI 线程非线程安全。
- 主线程卡死原因:Looper.loop() 是死循环,但依靠消息驱动,无消息阻塞则不卡死。
- 区分 Handler:通过 Message 中的 target 字段指向 Handler。
- quit vs quitSafely:立即停止 vs 处理完当前消息后停止。
- 线程切换:子线程 Handler 发 msg 给主线程 Handler。
- 关联 Looper:构造函数中调用 Looper.myLooper()。
View 绘制相关
- 绘制流程:Measure -> Layout -> Draw。
- MeasureSpec:测量模式(EXACTLY, AT_MOST, UNSPECIFIED)+ 尺寸。
- 子 View 规则:父 View 根据 MeasureSpec 决定子 View 大小。
- wrap_content 不起作用:父布局限制了大小(如 Match_Parent 且无权重)。
- 获取宽高方法:onSizeChanged, ViewTreeObserver, post 回调。
- onCreate 获取不到:此时 View 尚未测量布局完成。
- View.post vs Handler.post:View.post 确保 View 已加载,Handler.post 取决于 Looper。
- 刷新机制:Choreographer 调度 VSync 信号。
- Choreography 原理:协调 UI 渲染与输入事件。
- 双缓冲:避免画面撕裂,后台缓冲区绘制完成后交换。
- SurfaceView:独立 Surface,性能高,适合视频游戏,但不支持透明背景。
总结
Android 面试不仅考察 API 记忆,更关注底层原理与最佳实践。掌握上述知识点有助于构建扎实的技术基础。