1. Android 事件分发流程
事件分发遵循 Activity → Window → ViewGroup → View 的层级链,核心方法包括:
- dispatchTouchEvent():负责事件的分发,返回值表示事件是否被消费。
- onInterceptTouchEvent()(仅 ViewGroup 有):判断是否拦截事件,默认不拦截。
- onTouchEvent():处理点击事件,返回值决定是否消耗事件。
流程:
- 事件从 Activity 开始,通过 dispatchTouchEvent () 传递给 Window(PhoneWindow)。
- Window 将事件传递给顶级 ViewGroup,ViewGroup 通过 onInterceptTouchEvent () 决定是否拦截。
- 若不拦截,事件递归传递给子 View,最终由 View 的 onTouchEvent () 处理。
- 若事件未被消费,会沿原路返回(回溯)。
2. Kotlin 协程
2.1Kotlin 协程的优势是什么?
协程是轻量级的线程管理工具,优势包括:
- 非阻塞式并发:挂起而非阻塞线程,减少上下文切换开销。
- 简化异步代码:使用
suspend
函数和结构化并发(如launch
、async
)避免回调地狱。 - 资源管理:通过
Job
和CoroutineScope
自动回收资源,防止内存泄漏。 - 线程调度灵活:通过
Dispatchers
(如IO
、Main
、Default
)指定执行线程。
2.2解释 suspend
关键字的作用。
suspend
关键字标记一个函数为挂起函数,允许协程在执行该函数时暂停,保存上下文状态,待结果返回后恢复执行。挂起函数只能在协程或其他挂起函数中调用。
3. Android 四大组件
3.1 简述 Activity、Service、BroadcastReceiver 和 ContentProvider 的作用。
- Activity:UI 界面的载体,管理生命周期(onCreate → onStart → onResume → onPause → onStop → onDestroy)。
- Service:在后台执行任务,不提供 UI。分为启动式(startService)和绑定式(bindService)。
- BroadcastReceiver:监听系统或应用发出的广播事件(如网络变化、电量低)。
- ContentProvider:跨应用共享数据,通过 URI 访问 SQLite 数据库、文件等。
3.2 Activity 的启动模式有哪些?
- standard(默认):每次启动创建新实例。
- singleTop:若 Activity 在栈顶,复用当前实例(调用 onNewIntent)。
- singleTask:若 Activity 存在于栈中,清空其上的所有 Activity。
- singleInstance:单独创建一个任务栈,该 Activity 独占此栈。
4. Android 基本系统机制
简述 Handler 机制的原理。
答案:
Handler 用于在子线程与主线程间传递消息,核心组件包括:
- Handler:发送和处理消息。
- Looper:循环从 MessageQueue 中取出消息。
- MessageQueue:存储消息的队列。
- Message:携带数据的消息对象。
流程:
- 子线程通过 Handler 发送 Message 到 MessageQueue。
- Looper 不断轮询 MessageQueue,取出消息。
- 将消息分发给对应的 Handler 处理(在主线程中执行)。
5. Android 架构设计
5.1MVVM 架构的优势是什么?
MVVM(Model-View-ViewModel)通过数据绑定和 LiveData 实现视图与逻辑分离,优势包括:
- 解耦:View 只关注 UI 展示,ViewModel 处理业务逻辑。
- 可测试性:ViewModel 不依赖 Android 框架,便于单元测试。
- 响应式编程:LiveData 自动更新 UI,避免手动刷新。
- 生命周期感知:LiveData 自动处理配置变化(如旋转屏幕)。
5.2Jetpack 组件有哪些?
Jetpack 是官方组件库,常用组件包括:
- ViewModel:存储与界面相关的数据,处理配置变化。
- LiveData:可观察的数据持有者,自动感知生命周期。
- Room:SQLite 数据库的抽象层,提供类型安全的 DAO。
- Data Binding:将布局文件与数据绑定。
- WorkManager:管理后台任务,兼容不同 Android 版本。
6.如何优化 Android 应用的性能?
- 布局优化:减少嵌套层级,使用 ConstraintLayout 替代 RelativeLayout。
- 内存管理:避免内存泄漏(如静态 Activity 引用),使用 ViewModel 管理数据。
- 异步处理:协程、Handler 或 WorkManager 处理耗时操作。
- 图片处理:Glide/Picasso 加载图片,避免大图片 OOM。
- 启动优化:延迟初始化非关键组件,使用 App Startup 框架。
7.简述 Android 的内存泄漏场景
- 静态变量持有 Activity 引用:导致 Activity 无法被回收。
- 非静态内部类持有外部类引用:如 AsyncTask、Handler。
- 资源未关闭:Cursor、文件流、BroadcastReceiver 未注销。
- 单例持有 Context:建议使用 Application Context。