最近Android面试的一些总结

345 阅读5分钟

一、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 相关需求时是否设计过滑动问题,如何处理