一、Android 基础与组件
四大组件介绍
Activity 启动模式
Activity 启动流程(涉及 App 发起进程、system_server 进程、Zygote 进程、新进程的创建及主线程 Looper 准备、ApplicationThread 绑定 AMS 等过程)
Handler 机制
Handler 机制的基本组件和工作原理
如何使用 Handler 进行线程切换
新建 Handler 时,线程由什么决定
Binder 机制
跨进程通信 (IPC)
AIDL
广播
ContentProvider
二、Android UI 与性能
布局与绘制
事件分发机制
绘制流程
滑动冲突如何处理
性能优化
ANR (Application Not Responding)
内存泄漏(定义:当应用程序不正确地管理内存时,会发生内存泄漏,导致内存占用过高,甚至导致应用程序崩溃)
常见的性能优化方面:布局优化(应对过于复杂的布局导致的响应慢或卡顿)、图片优化(谨慎使用,适当压缩和缓存)、网络请求优化(减少请求次数、提高响应速度)、数据库优化(优化设计和使用缓存)、多线程优化(避免死锁、线程竞争)、内存优化(及时释放不再需要的内存、避免不必要分配)、代码优化(优化结构和算法)、安全性优化(避免不安全代码、使用加密技术)
解决性能优化(如 UI 卡顿、内存泄漏)的具体例子
数据量很大时的处理方法
内存切换
三、
Android 常用库与框架原理
图片加载库底层原理
Glide
事件总线底层原理
EventBus
网络库底层原理
OkHttp
Retrofit
依赖注入
Dagger Hilt
Dagger 的流程和基本组件
是否使用过依赖注入
四、架构模式与依赖注入
MVP、MVVM、MVI
MVP 和 MVVM 的区别及优缺点
插件化 (hook)
五、Jetpack Compose
Compose 的理解
状态管理
MutableState (Compose State) 的定义(Jetpack Compose UI 框架内部用于创建可观察的、局部 UI 状态的机制),作用(直接驱动 Composable 函数的重组),位置(主要在 Compose UI 层,通常与 remember 结合使用,生命周期与 Composable 绑定)和用途(维护组件内部 UI 状态,如按钮点击计数、文本输入框内容、UI 展开/折叠状态)
remember 和 mutableStateOf 的作用:remember 在 Composable 函数生命周期内记住一个值,确保 Recomposition 时不重置,常与 mutableStateOf 结合使用。但当 Activity 重建(如配置变更:屏幕旋转)时,状态会丢失。mutableStateOf 创建可观察的 MutableState 对象,其值改变会触发 Recomposition。
rememberSaveable 的作用:除了 remember 的功能外,还能在 Activity 重建时通过 Bundle 保留和恢复状态。
Modifier
Modifier 的作用:
用于修饰或装饰 Composable 函数,改变它们的行为、外观或布局方式,以链式调用方式应用。
常见的 Modifier:fillMaxSize()、padding()、width()、height()、background()、clickable()、weight()、align()、clip()、shadow() 等。
布局容器
Column:垂直方向排列子元素。
Row:水平方向排列子元素。
Box:堆叠式布局,子元素可互相覆盖,类似于 FrameLayout。
LazyColumn / LazyRow:类似于 RecyclerView,只渲染屏幕可见项,用于显示大量数据列表,实现性能优化。
ConstraintLayout:通过约束关系布局子元素。
Compose 副作用
六、Kotlin 相关
Kotlin 与 Java 对比
为什么不直接用 Kotlin 开发?
Kotlin 和 Java 相比的特性和优缺点
Kotlin 和 Java 混合开发可能遇到的问题
Kotlin 反射
Kotlin 泛型
Kotlin 委托属性(是否用过,如何实现)
协程
什么是 Kotlin 协程:轻量级线程,由 JVM 或操作系统调度,可在不阻塞线程的情况下暂停和恢复执行。
协程的优势:减少线程开销(单个线程可运行多个协程)、简化异步代码(使用同步写法处理异步逻辑,如 await() 替代回调)。
协程核心概念:协程作用域 (CoroutineScope) 管理协程生命周期、调度器 (Dispatcher) 指定协程运行线程、挂起函数 (suspend) 可暂停和恢复,只能在协程或其他挂起函数中调用。
Handler 和 Flow 的区别
LiveData 和 Flow 的区别
什么是冷流和热流
StateFlow (Kotlin Coroutines) 的定义(Kotlin Coroutines 库提供的“热”数据流,总是持有当前值的状态持有者),作用(在 ViewModel 层管理和暴露业务数据和 UI 状态),位置(主要在 ViewModel 层或更低的数据层,独立于 UI 框架)和用途(提供 UI 所需的持久化数据,处理业务逻辑,并在配置变更中保留状态)。
七、Java 基础与进阶
JVM\GC\Collection\Map
多线程与并发
各种锁机制
线程池工作原理:
创建线程池后,等待任务请求。
execute() 方法添加任务时:
若运行线程数小于 corePoolSize,立即创建线程运行任务。
若运行线程数大于或等于 corePoolSize,将任务放入队列。
若队列已满且运行线程数小于 maximumPoolSize,创建非核心线程立即运行任务。
若队列已满且运行线程数大于或等于 maximumPoolSize,启动饱和拒绝策略。
线程完成任务后,从队列中取下一个执行。
线程空闲超过 keepAliveTime 且运行线程数大于 corePoolSize,该线程被停掉;最终线程池会收缩到 corePoolSize 大小。
八、计算机网络与通用技术
网络协议 (例如:HTTP/HTTPS、TCP/IP等基础知识)
网址证书不合法或过期如何访问 JS?
九、测试
单元测试
是否用过单元测试
Jacoco 统计
UI 测试
Espresso UI 层交互逻辑
逻辑层测试
JUnit
Android 测试基础库
AndroidX Test 提供 Android 测试基础库和运行器
十、算法
合并两个二维整数矩阵\无重复字符的最长子串\两数只和
十一、项目经验与软技能
过往项目介绍(包括 UI 框架使用情况)
详细描述从 0 到 1 设计的 XXX 项目情况,包括架构设计
做项目时遇到的困难
做项目时对权限设置的注意事项
做 UI 相关需求时是否设计过滑动问题,如何处理