跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Java大前端java算法

Android 中高级开发核心面试题与解析

Android 中高级开发面试涵盖 Java 基础、集合框架、多线程、虚拟机原理、Android 四大组件、UI 绘制机制、内存优化、IPC 通信及系统框架等内容。常见高频考点,包括 Activity 启动模式、Handler 内存泄漏解决方案、SoftReference 与 WeakReference 区别、OOM 避免策略、Dalvik 与 Linux 进程关系等核心知识点,并补充了音视频、Flutter、算法及企业实战问题,旨在帮助开发者系统复习技术栈,提升面试通过率。

小熊软糖发布于 2025/2/7更新于 2026/7/1735 浏览
Android 中高级开发核心面试题与解析

Android 中高级开发核心面试题与解析

前言

本文整理了 Android 中高级开发岗位的高频面试题,涵盖 Java 基础、Android 核心机制、系统框架、性能优化及音视频算法等方向。内容基于实际面试经验总结,旨在帮助开发者系统复习技术栈,提升面试通过率。

一、Android 核心机制

1. Activity 的启动方式

Activity 的 LaunchMode 决定了实例在任务栈中的行为:

  • standard:默认模式。每次启动都创建新实例,不管栈中是否已存在。
  • singleTop:如果目标 Activity 位于栈顶,则复用该实例并调用 onNewIntent;否则创建新实例。
  • singleTask:栈内复用。若栈中存在该实例,则将该实例之上的所有 Activity 出栈,并调用 onNewIntent。同时具有 clearTop 机制。
  • singleInstance:独占一个任务栈。该 Activity 是栈中唯一的实例,其他应用可通过 Intent 共享此全局唯一实例。

2. Handler 防止内存泄漏

Handler 导致内存泄漏的原因在于其内部持有 Looper 和 MessageQueue,且非静态匿名类会隐式持有外部 Activity 引用。

解决方案:

  1. 将 Handler 声明为静态内部类。
  2. 使用 WeakReference 持有 Activity 引用。
  3. 在 Activity 销毁时移除回调和消息。
public class MyActivity extends AppCompatActivity {
    private static class MyHandler extends Handler {
        private final WeakReference<MyActivity> mActivityRef;

        public MyHandler(MyActivity activity) {
            mActivityRef = new WeakReference<>(activity);
        }

        @Override
        public void handleMessage(Message msg) {
            MyActivity activity = mActivityRef.get();
            if (activity != null) {
                // 更新 UI
            }
        }
    }

    private MyHandler mHandler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler = new MyHandler(this);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mHandler != null) {
            mHandler.removeCallbacksAndMessages(null);
        }
    }
}

3. SoftReference 与 WeakReference 的区别

  • WeakReference:弱引用对象的生命周期与强引用一致,只要 GC 发生时,无论内存是否充足,都会被回收。常用于缓存场景。
  • SoftReference:软引用。仅在内存不足(OOM)时才进行回收。常用于实现内存敏感的缓存。

4. 如何避免 OOM

  1. 减少内存占用:使用 ArrayMap/SparseArray 代替 HashMap/ArrayList(针对小数据量)。
  2. 避免 Enum:在 Android 中 Enum 会消耗较多内存,尽量用 int 常量替代。
  3. Bitmap 优化:降低图片分辨率,使用 inSampleSize 采样加载,及时 recycle 不可复用的 Bitmap。
  4. 资源管理:避免加载过大的图片资源,考虑分段加载或懒加载。

5. Dalvik 进程、Linux 进程、线程的区别

  • Dalvik/ART 进程:每个 Android App 运行在一个独立的虚拟机进程中,拥有独立的内存空间。
  • Linux 进程:Dalvik 进程本质上是 Linux 进程,受内核调度。
  • 线程:App 内的多个线程共享同一进程的内存空间,通过 IPC 或 Binder 通信。

6. Framework 工作原理及 View 生成机制

Framework 是对 Linux Kernel 和 Lib 库的封装,提供 WMS、AMS、Binder 等机制供 App 使用。

View 生成流程:

  1. attach:Activity 初始化时创建 PhoneWindow(Window 子类)。
  2. setContentView:在 onCreate 中调用,创建 DecorView。
  3. addView:DecorView 将布局文件加载进来,构建 View 树。
  4. 绘制:经过 Measure、Layout、Draw 三个阶段渲染到屏幕。

二、Java 基础与并发

1. Java 集合框架

  • HashMap:基于数组 + 链表 + 红黑树。JDK 1.8 后解决哈希冲突采用链地址法,链表长度超过 8 转为红黑树。
  • ConcurrentHashMap:JDK 1.7 分段锁,JDK 1.8 CAS + synchronized 保证线程安全。
  • ArrayList vs LinkedList:ArrayList 基于动态数组,查询快插入慢;LinkedList 基于双向链表,插入删除快查询慢。

2. 多线程与线程池

  • ThreadLocal:线程隔离变量,需手动 remove 防止内存泄漏。
  • 线程池参数:corePoolSize, maximumPoolSize, keepAliveTime, workQueue, threadFactory, handler。
  • 拒绝策略:AbortPolicy(抛异常)、CallerRunsPolicy(调用者执行)、DiscardPolicy(丢弃)等。

3. JVM 与 ART

  • JVM:Java 虚拟机规范,不同厂商实现不同。
  • ART:Android Runtime,取代了 Dalvik。采用 AOT(Ahead-Of-Time)编译,安装时预编译,运行时效率高但安装慢。
  • GC 算法:标记 - 清除、复制、标记 - 整理、分代收集。

三、Android 性能调优

1. 启动优化

  • 异步初始化:延迟非必要组件初始化。
  • 主线程瘦身:减少主线程耗时操作,如 IO、网络、复杂计算。
  • 冷启动指标:从点击图标到首帧绘制完成的时间。

2. 内存优化

  • LeakCanary:检测内存泄漏工具。
  • MAT:Memory Analyzer Tool,分析 Dump 文件。
  • 监控:使用 System.out.print 或 Logcat 监控堆内存变化。

3. 卡顿检测

  • Choreographer:监听 VSYNC 信号,判断帧绘制时间是否超过 16ms。
  • StrictMode:检测主线程违规操作。

四、系统框架与 IPC

1. Binder 机制

  • 特点:一次拷贝,支持跨进程通信,权限控制严格。
  • 架构:Client -> Service Manager -> Server。
  • 原理:Mmap 映射驱动,共享内存传输数据。

2. AMS/WMS

  • AMS (ActivityManagerService):管理 Activity、Service、Broadcast 生命周期。
  • WMS (WindowManagerService):管理窗口显示、输入事件分发。

3. 四大组件通信

  • Intent:显式与隐式 Intent。
  • ContentProvider:跨应用数据共享。
  • BroadcastReceiver:广播接收,有序/无序广播。

五、音视频与 Flutter

1. 音视频基础

  • 编码原理:去除冗余信息(空间/时间冗余),压缩率取决于编码格式(H.264/H.265)。
  • 直播秒开:CDN 加速、预加载、降低首屏复杂度。
  • 图像滤波:高斯模糊、均值滤波、中值滤波。

2. Flutter 高频点

  • Widget 树:UI 描述层,不可变。
  • Element 树:状态管理层,可复用。
  • RenderObject 树:布局与绘制层,负责具体渲染。
  • Dart 语言:AOT 编译,Hot Reload 热重载机制。

六、算法与数据结构

1. 常见算法

  • 素数查找:埃拉托斯特尼筛法。
  • 二分查找:适用于有序数组,时间复杂度 O(log n)。
  • 最长回文子串:中心扩展法或 Manacher 算法。
  • 雨水问题:双指针或动态规划计算接水量。

2. 数据结构

  • 数组:连续内存,随机访问快。
  • 链表:非连续内存,插入删除快。
  • 树与图:层级关系与网状关系存储。

七、企业实战问题

  1. SP 频繁操作后果:可能导致数据库锁竞争,建议批量写入或使用内存缓存。
  2. SP 存储限制:通常几 MB,不适合存大文件。
  3. Application 启动 Activity:Context 需要 ContextWrapper 或 ContextThemeWrapper,不能直接用 Application 启动有主题要求的 Activity。
  4. SD 卡:Android 6.0+ 对外部存储权限管理更严格,建议使用 Scoped Storage。

结语

掌握上述知识点有助于应对 Android 中高级岗位的面试挑战。建议结合源码阅读与实际项目经验,深入理解底层原理,提升解决复杂问题的能力。

目录

  1. Android 中高级开发核心面试题与解析
  2. 前言
  3. 一、Android 核心机制
  4. 1. Activity 的启动方式
  5. 2. Handler 防止内存泄漏
  6. 3. SoftReference 与 WeakReference 的区别
  7. 4. 如何避免 OOM
  8. 5. Dalvik 进程、Linux 进程、线程的区别
  9. 6. Framework 工作原理及 View 生成机制
  10. 二、Java 基础与并发
  11. 1. Java 集合框架
  12. 2. 多线程与线程池
  13. 3. JVM 与 ART
  14. 三、Android 性能调优
  15. 1. 启动优化
  16. 2. 内存优化
  17. 3. 卡顿检测
  18. 四、系统框架与 IPC
  19. 1. Binder 机制
  20. 2. AMS/WMS
  21. 3. 四大组件通信
  22. 五、音视频与 Flutter
  23. 1. 音视频基础
  24. 2. Flutter 高频点
  25. 六、算法与数据结构
  26. 1. 常见算法
  27. 2. 数据结构
  28. 七、企业实战问题
  29. 结语
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Nginx 核心功能与配置指南
  • RAG 系统效果评估指南:核心指标与 LangChain4j 实践
  • 前端实现浏览器通知功能指南
  • 转行 Python 工程师:学习路径与实战经验总结
  • 科学家证实高脂饮食致肥胖可能促进癌细胞生长
  • Python 并发编程实战:多线程、多进程与线程池应用
  • Apache IoTDB 时序数据库选型指南与核心功能解析
  • 基于 Termux 在 Android 部署 OpenClaw 实现移动端 AI 助理
  • 大型视觉模型(LVM)应用实例:2024 年挑战与 7 个用例解析
  • 基于 Git Worktrees 与 AI 助手的高效并行开发实践
  • 算法刷题:替换所有问号与提莫攻击
  • 一卡通核心交易平台国产数据库实践:架构迁移与高可用落地
  • 在线图书借阅平台设计与实现
  • 行星减速器原理、计算与 C++ 实现
  • Windows 下 MATLAB 与 C/C++ 混合编程:DLL 生成与调用
  • 神经网络常用优化技术详解:AdaGrad、RMSProp、Adam、学习率衰减与早停
  • 基于 AI 辅助开发的高校宿舍管理系统实战
  • 原生 AI PPT 生成应用“蕉幻”的技术架构与使用解析
  • 火山引擎发布豆包编程模型 Doubao-Seed-Code,支持 Agentic 任务与视觉理解
  • 设计模式精讲:适配器模式的原理与 Java 实现

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online