初级 Android 开发工程师面试题与答案

Milad Bonakdar
作者
通过 Kotlin、生命周期、Jetpack Compose、Room、网络和协程问题,准备初级 Android 开发面试。
引言
初级 Android 开发面试通常会考察你能否用实际场景解释 Kotlin 基础、Android 生命周期、Compose 状态、本地存储、网络请求和协程。好的回答会把概念连接到一个可靠的小应用:把 UI 状态放在合适的位置,不阻塞主线程,安全持久化数据,并清楚处理错误。
使用本指南练习简短回答,并把每个主题关联到简历或作品集中的小项目。如果你做过待办事项、天气应用或 API 驱动页面,可以用这些例子让回答更具体,而不是像背诵定义。
Kotlin 基础知识 (6 个问题)
1. Kotlin 中 val 和 var 有什么区别?
答案:
val: 声明一个不可变的(只读)变量。一旦赋值,其值就不能更改。var: 声明一个可变的变量。其值可以在初始化后更改。- 最佳实践: 默认情况下使用
val以确保安全。仅在需要重新赋值时才使用var。
稀有度: 非常常见 难度: 简单
2. 解释 Kotlin 中的可空类型和安全调用运算符。
答案: Kotlin 的类型系统区分可空类型和非可空类型,以防止空指针异常。
- 可空类型: 在类型后添加
?:String? - 安全调用 (
?.): 仅当对象不为 null 时才调用方法 - Elvis 运算符 (
?:): 如果为 null,则提供默认值 - 非空断言 (
!!): 如果为 null,则抛出异常(谨慎使用)
稀有度: 非常常见 难度: 简单
3. Kotlin 中 class 和 data class 有什么区别?
答案:
- 普通类: 标准类定义
- 数据类: 自动生成用于保存数据的有用方法
equals()和hashCode()toString()copy()函数- 用于解构的
componentN()函数
稀有度: 非常常见 难度: 简单
4. Kotlin 中的 Lambda 表达式和高阶函数是什么?
答案:
- Lambda: 可以作为值传递的匿名函数
- 高阶函数: 将函数作为参数或返回函数的函数
稀有度: 非常常见 难度: 中等
5. 解释 Kotlin 中的扩展函数。
答案: 扩展函数允许您向现有类添加新函数,而无需修改其源代码。
稀有度: 常见 难度: 简单
6. Kotlin 中 == 和 === 有什么区别?
答案:
==: 结构相等(使用equals()比较值)===: 引用相等(比较内存引用)
稀有度: 常见 难度: 简单
Android 组件 (5 个问题)
7. 什么是 Activity 并解释其生命周期。
答案: Activity 代表具有用户界面的单个屏幕。它具有明确定义的生命周期:
onCreate(): 创建 Activity。初始化 UI,设置内容视图。onStart(): Activity 变为可见。onResume(): Activity 位于前台并可交互。onPause(): Activity 失去焦点(另一个 activity 进入前台)。onStop(): Activity 不再可见。onDestroy(): Activity 被销毁。
稀有度: 非常常见 难度: 简单
8. Activity 和 Fragment 有什么区别?
答案:
- Activity: 代表一个完整的屏幕。用户交互的入口点。有自己的生命周期。
- Fragment: Activity 中可重用的 UI 部分。一个 activity 中可以存在多个 fragment。具有与宿主 activity 相关的自己的生命周期。
- Fragment 的优点:
- 跨 activity 的可重用性
- 模块化 UI 组件
- 对平板电脑的支持(多窗格布局)
- 导航组件集成
稀有度: 非常常见 难度: 简单
9. 什么是 Intent 以及它有哪些类型?
答案: Intent 是一个消息传递对象,用于请求另一个应用程序组件执行操作。
- 显式 Intent: 指定要启动的确切组件(按类名)
- 隐式 Intent: 声明一个通用操作,系统会找到相应的组件
稀有度: 非常常见 难度: 简单
10. 什么是 Android 中的 Service?
答案: Service 是在后台运行以执行长时间运行的操作而无需用户界面的组件。
- 类型:
- 前台 Service: 执行引人注意的操作(音乐播放器)。显示通知。
- 后台 Service: 执行用户未直接注意到的操作。
- 绑定 Service: 允许组件绑定到它并进行交互。
稀有度: 常见 难度: 中等
11. 什么是 BroadcastReceiver?
答案: BroadcastReceiver 是一个响应系统范围广播公告的组件。
- 用例: 电池电量低、网络连接变化、收到 SMS、启动完成
- 注册:
- 静态: 在 AndroidManifest.xml 中(在新版本的 Android 中受到限制)
- 动态: 在代码中(首选)
稀有度: 常见 难度: 简单
UI 开发 (4 个问题)
12. LinearLayout、RelativeLayout 和 ConstraintLayout 有什么区别?
答案:
- LinearLayout: 将子项排列在单行或单列中。简单但可能导致嵌套布局。
- RelativeLayout: 相对于彼此或父项定位子项。更灵活但更复杂。
- ConstraintLayout: 现代、灵活的布局。扁平的视图层次结构。推荐用于复杂的 UI。
稀有度: 非常常见 难度: 简单
13. 什么是 RecyclerView 以及它是如何工作的?
答案: RecyclerView 是一个高效的 widget,通过回收视图来显示大型列表。
- 组件:
- Adapter: 将数据绑定到视图
- ViewHolder: 保存对视图的引用(避免
findViewById调用) - LayoutManager: 定位项目(线性、网格、交错)
稀有度: 非常常见 难度: 中等
14. 什么是 Jetpack Compose?
答案: Jetpack Compose 是 Android 的现代声明式 UI 工具包。
- 声明式: 描述 UI 应该是什么样子,而不是如何构建它
- 优点: 更少的代码、直观、强大、加速开发
- Composable 函数: Compose UI 的构建块
稀有度: 非常常见 难度: 简单
15. match_parent 和 wrap_content 有什么区别?
答案: 这些是定义视图尺寸的布局参数:
match_parent: 视图展开以填充父项的大小wrap_content: 视图调整自身大小以适应其内容- 固定大小: 特定的 dp 值(例如,
100dp)
稀有度: 非常常见 难度: 简单
数据和网络 (5 个问题)
16. 如何在 Android 中发出网络请求?
答案:
使用 Retrofit 或 OkHttp 等库进行联网。避免直接使用 HttpURLConnection。
稀有度: 非常常见 难度: 中等
17. 什么是 Room 以及如何使用它?
答案: Room 是 SQLite 之上的抽象层,可简化数据库访问。
- 组件:
- Entity: 代表一个表
- DAO(数据访问对象): 定义数据库操作
- Database: 数据库持有者
稀有度: 非常常见 难度: 中等
18. 什么是 SharedPreferences?
答案: SharedPreferences 将少量原始数据存储为键值对。
- 用例: 用户设置、首选项、简单标志
- 不适用于: 大型数据、复杂对象(请改用 Room)
稀有度: 非常常见 难度: 简单
19. SharedPreferences 中 apply() 和 commit() 有什么区别?
答案: 两者都将更改保存到 SharedPreferences,但行为有所不同:
apply(): 异步。立即返回。更改在后台写入磁盘。没有返回值。commit(): 同步。阻塞直到写入更改。返回布尔值(成功/失败)。- 最佳实践: 除非您需要返回值,否则请使用
apply()。
稀有度: 常见 难度: 简单
20. 什么是 Kotlin 中的协程?
答案: 协程提供了一种按顺序编写异步代码的方法,使其更易于阅读和维护。
- 优点: 轻量级、结构化并发、异常处理
- 关键概念:
suspend: 可以暂停和恢复的函数launch: 启动协程(即发即弃)async: 启动协程并返回结果- Dispatchers: 控制协程在哪个线程上运行
稀有度: 非常常见 难度: 中等


