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

Android 之 面试八股文

一、基础组件与生命周期

  1. ​Activity生命周期​

    • ​问题​​:描述Activity从启动到销毁的完整生命周期方法,并说明onSaveInstanceState()的调用时机。

    • ​参考答案​​:

      • onCreate()→ onStart()→ onResume()(活跃状态) → onPause()(失去焦点) → onStop()(完全不可见) → onDestroy()

      • onSaveInstanceState():在Activity可能被销毁前调用(如屏幕旋转),用于保存临时数据到Bundle。

    • ​考察点​​:生命周期顺序、状态恢复、资源释放时机。

  2. ​Fragment通信方式​

    • ​问题​​:列举3种Fragment间通信方式,并对比优缺点。

    • ​参考答案​​:

      • ​ViewModel共享​​:通过同一Activity作用域的ViewModel共享数据(推荐,解耦性强)。

      • ​Fragment Result API​​:使用setFragmentResult()传递Bundle(无需直接引用)。

      • ​接口回调​​:Fragment定义接口,Activity实现并转发(代码冗余,适合简单场景)。

二、UI系统与自定义View

  1. ​View绘制流程​

    • ​问题​​:解释View的onMeasure()onLayout()onDraw()的作用,并说明如何优化自定义View的性能。

    • ​参考答案​​:

      • onMeasure():计算View尺寸(需处理MeasureSpec模式)。

      • onLayout():确定子View位置。

      • onDraw():绘制内容(避免在此创建对象或耗时操作)。

      • ​优化​​:使用ViewStub延迟加载、减少布局层级、启用硬件加速。

  2. ​事件分发机制​

    • ​问题​​:描述触摸事件从Activity到View的分发流程,并解决嵌套滑动冲突(如ScrollView内嵌RecyclerView)。

    • ​参考答案​​:

      • 流程:Activity.dispatchTouchEvent()→ ViewGroup.onInterceptTouchEvent()→ View.onTouchEvent()

      • ​冲突解决​​:重写父容器的onInterceptTouchEvent(),根据滑动方向决定是否拦截(如垂直滑动时父容器不拦截)。

三、多线程与异步处理

  1. ​Handler机制​

    • ​问题​​:解释Handler、Looper、MessageQueue的关系,并说明如何避免内存泄漏。

    • ​参考答案​​:

      • ​关系​​:Looper轮询MessageQueue,Handler发送和处理Message。

      • ​防泄漏​​:使用静态内部类 + WeakReference持有Context,或在onDestroy()中调用handler.removeCallbacks()

  2. ​Kotlin协程优势​

    • ​问题​​:对比协程与RxJava的适用场景,并说明协程如何简化网络请求。

    • ​参考答案​​:

      • ​协程​​:轻量级线程、结构化并发(适合顺序逻辑,如链式请求)。

      • ​RxJava​​:复杂数据流处理(如合并多个API响应)。

      • ​示例​​:

viewModelScope.launch { val data = withContext(Dispatchers.IO) { api.fetchData() }updateUI(data)
}

四、性能优化策略

  1. ​内存泄漏场景与解决​

    • ​问题​​:列举3个常见内存泄漏场景(如静态Context),并提供解决方案。

    • ​参考答案​​:

      • 静态Context → 改用ApplicationContext或弱引用。

      • 未注销广播 → 在onDestroy()中调用unregisterReceiver()

      • 匿名内部类持有外部引用 → 静态内部类 + 弱引用。

  2. ​冷启动优化​

    • ​问题​​:应用冷启动耗时超过1秒,如何定位和优化?

    • ​参考答案​​:

      • ​定位工具​​:Android Studio Profiler的启动时间分析。

      • ​优化方案​​:

        • 延迟初始化第三方库(使用App Startup)。

        • 减少主线程任务(用线程池处理IO操作)。

        • 使用SplashScreen API避免白屏。

五、架构设计与模式

  1. ​MVVM与MVI对比​

    • ​问题​​:解释MVVM和MVI架构的区别,并说明MVI如何解决状态管理问题。

    • ​参考答案​​:

      • ​MVVM​​:数据驱动UI(LiveData + ViewModel),但状态分散。

      • ​MVI​​:单向数据流(ViewState → 事件 → 更新状态),状态集中管理(如用Kotlin Flow实现)。

  2. ​模块化方案​

    • ​问题​​:如何将单模块App拆分为模块化架构?需考虑哪些问题?

    • ​参考答案​​:

      • ​步骤​​:按功能划分模块(登录、支付等),基础库抽离为独立Module。

      • ​关键点​​:

        • 依赖注入解耦(使用Hilt)。

        • 路由框架(如ARouter)解决跨模块跳转。

        • Gradle配置按需编译。

六、系统原理与新技术

  1. ​Binder机制​

    • ​问题​​:解释Binder在IPC中的一次拷贝原理,并说明其与Socket通信的性能差异。

    • ​参考答案​​:

      • ​原理​​:通过mmap内存映射共享内核空间,减少数据拷贝次数。

      • ​性能​​:Binder传输速度比Socket快3倍,适合高频调用(如系统服务)。

  2. ​Compose优势​

    • ​问题​​:对比Compose与XML布局的渲染性能差异,并说明声明式UI的核心思想。

    • ​参考答案​​:

      • ​性能​​:Compose跳过冗余measure/layout阶段,减少嵌套层级。

      • ​声明式​​:UI = f(State)(状态变化自动触发重组,无需手动更新View)。

附:面试准备建议​

  1. ​基础巩固​​:

    • 必刷:Activity/Fragment生命周期、四大组件通信、Handler机制。

  2. ​进阶重点​​:

    • 深入View绘制/事件分发、内存优化、协程原理。

  3. ​架构设计​​:

    • 准备1-2个模块化/MVVM项目案例,说明技术选型原因。

  4. ​工具使用​​:

    • 熟练使用Profiler、LeakCanary、Systrace定位问题

http://www.lryc.cn/news/613087.html

相关文章:

  • GCC与NLP实战:编译技术赋能自然语言处理
  • 解决GitHub无法打开
  • idea开发工具中git如何忽略编译文件build、gradle的文件?
  • 复杂井眼测量中,陀螺定向和磁通门定向哪个更胜一筹?
  • 幕后英雄 —— Background Scripts (Service Worker)
  • 浅析 Berachain v2 ,对原有 PoL 机制进行了哪些升级?
  • 我的世界Java版1.21.4的Fabric模组开发教程(十七)自定义维度
  • 比较一下XGBoost与LSTM、GRU、Transformer数据格式方面的核心区别
  • 零基础-动手学深度学习-9.1. 门控循环单元(GRU)及代码实现
  • Docker国内可用镜像列表(长期免费)
  • 接入小甲鱼数字人API教程【详解】
  • Next.js 样式:CSS 模块、Sass 等
  • ENSP 中静态路由负载分担
  • vue3接收SSE流数据进行实时渲染日志
  • RabbitMQ-日常运维命令
  • CS231n2017 Assignment3 RNN、LSTM部分
  • 3深度学习Pytorch-神经网络--全连接神经网络、数据准备(构建数据类Dataset、TensorDataset 和数据加载器DataLoader)
  • PID基础知识
  • 关于其他副脑类 GPTs 市场现状及研究报告
  • mysql全屏终端全量、部分备份、恢复脚本
  • Python面试题及详细答案150道(16-30) -- 数据结构篇
  • 分布式微服务--GateWay(过滤器及使用Gateway注意点)
  • 告别YAML,在SpringBoot中用数据库配置替代配置文件
  • word生成问题总结
  • 【遥感图像入门】近三年遥感图像建筑物细粒度分类技术一览
  • Day116 若依融合mqtt
  • 界面组件DevExpress WPF中文教程:网格视图数据布局 - 紧凑模式
  • 音视频时间戳获取与同步原理详解
  • 【Docker】RustDesk远程控制-私有化部署开源版本
  • 生成式AI的“幽灵漏洞”:法律如何为技术的阴影划界