当前位置: 首页 > ds >正文

Android的事件分发流程、Kotlin协程、4大组件、Handler机制、架构设计、性能优化、内存泄漏

1. Android 事件分发流程
事件分发遵循 Activity → Window → ViewGroup → View 的层级链,核心方法包括:

  1. dispatchTouchEvent():负责事件的分发,返回值表示事件是否被消费。
  2. onInterceptTouchEvent()(仅 ViewGroup 有):判断是否拦截事件,默认不拦截。
  3. onTouchEvent():处理点击事件,返回值决定是否消耗事件。

流程

  • 事件从 Activity 开始,通过 dispatchTouchEvent () 传递给 Window(PhoneWindow)。
  • Window 将事件传递给顶级 ViewGroup,ViewGroup 通过 onInterceptTouchEvent () 决定是否拦截。
  • 若不拦截,事件递归传递给子 View,最终由 View 的 onTouchEvent () 处理。
  • 若事件未被消费,会沿原路返回(回溯)。

2. Kotlin 协程

2.1Kotlin 协程的优势是什么?
协程是轻量级的线程管理工具,优势包括:

  • 非阻塞式并发:挂起而非阻塞线程,减少上下文切换开销。
  • 简化异步代码:使用 suspend 函数和结构化并发(如 launchasync)避免回调地狱。
  • 资源管理:通过 Job 和 CoroutineScope 自动回收资源,防止内存泄漏。
  • 线程调度灵活:通过 Dispatchers(如 IOMainDefault)指定执行线程。

2.2解释 suspend 关键字的作用。
suspend 关键字标记一个函数为挂起函数,允许协程在执行该函数时暂停,保存上下文状态,待结果返回后恢复执行。挂起函数只能在协程或其他挂起函数中调用。

3. Android 四大组件

3.1 简述 Activity、Service、BroadcastReceiver 和 ContentProvider 的作用。

  1. Activity:UI 界面的载体,管理生命周期(onCreate → onStart → onResume → onPause → onStop → onDestroy)。
  2. Service:在后台执行任务,不提供 UI。分为启动式(startService)和绑定式(bindService)。
  3. BroadcastReceiver:监听系统或应用发出的广播事件(如网络变化、电量低)。
  4. ContentProvider:跨应用共享数据,通过 URI 访问 SQLite 数据库、文件等。

3.2 Activity 的启动模式有哪些?

  • standard(默认):每次启动创建新实例。
  • singleTop:若 Activity 在栈顶,复用当前实例(调用 onNewIntent)。
  • singleTask:若 Activity 存在于栈中,清空其上的所有 Activity。
  • singleInstance:单独创建一个任务栈,该 Activity 独占此栈。

4. Android 基本系统机制

简述 Handler 机制的原理。
答案
Handler 用于在子线程与主线程间传递消息,核心组件包括:

  • Handler:发送和处理消息。
  • Looper:循环从 MessageQueue 中取出消息。
  • MessageQueue:存储消息的队列。
  • Message:携带数据的消息对象。

流程

  1. 子线程通过 Handler 发送 Message 到 MessageQueue。
  2. Looper 不断轮询 MessageQueue,取出消息。
  3. 将消息分发给对应的 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。
http://www.xdnf.cn/news/17602.html

相关文章:

  • 第4章 程序段的反复执行2while语句P128练习题(题及答案)
  • 智慧农业-无人机视角庄稼倒伏农作物倒伏检测数据集VOC+YOLO格式541张1类别
  • VSCode添加Python、Java注释技巧、模板
  • 疏老师-python训练营-Day40训练和测试的规范写法
  • NumPy性能飞跃秘籍:向量化计算如何提升400倍运算效率?
  • istio笔记03--快速上手多集群mesh
  • 【C语言】深入探索预处理
  • Matlab 基于BP神经网络结合Bagging(BP-Bagging)集成算法的单变量时序预测 (单输入单输出)
  • 带冷端补偿的热电偶采集方案MAX31855
  • Dell PowerEdge: Servers by generation (按代系划分的服务器)
  • 【渲染流水线】[几何阶段]-[图元装配]以UnityURP为例
  • C++2024 年一级
  • Cursor设置
  • 【机器学习深度学习】模型选型:如何根据现有设备选择合适的训练模型
  • 【面试场景题】微博热点新闻系统设计方案
  • 一个“加锁无效“的诡异现象
  • #C语言——刷题攻略:牛客编程入门训练(七):分支控制(一)-- 涉及 %c前加空格:忽略起首的空白字符
  • Spring Boot Starter 自动化配置原理深度剖析
  • 把大模型“关进冰箱”——基于知识蒸馏 + 动态量化的小型化实战笔记
  • 推客系统开发全攻略:从架构设计到高并发实战
  • 【Python 高频 API 速学 ②】
  • 让大模型 “睡觉”:把版本迭代当作人类睡眠来设计(附可直接改造的训练作息表与代码)
  • 【Task2】【Datawhale AI夏令营】多模态RAG
  • Python基础教程(四)字符串和编码:深度探索Python字符串与编码的终极指南
  • Milvus 向量数据库基础操作解析
  • Node.js特训专栏-实战进阶:22. Docker容器化部署
  • 模板方法模式:优雅封装算法骨架
  • 代码随想录day60图论10
  • flex布局初体验
  • Kettle ETL 工具存在的问题以及替代方案的探索