Android 面试高频问答
1. 如何优化 ListView 的流畅度?
- 精简 Item 布局,减少层级。
- 复用 convertView。
- 使用 ViewHolder。
- 图片异步加载。
- 快速滑动时不加载图片。
- 图片压缩。
- 分页加载数据。
2. Android 安全问题的常见类型有哪些?
- 错误导出的组件。
- 不严格的参数校验。
- WebView 引入的安全问题。
- 不混淆、不防二次打包。
- 明文存储敏感信息。
- 错误使用 HTTPS。
- 自定义加密方法的安全性。
- 滥用权限、内存泄露、使用 debug 签名。
3. 如何减小 APK 大小?
- 移除重复或未使用的代码。
- 使用 ProGuard 混淆代码。
- 仅支持必要的 CPU 架构。
- 使用 Lint 查找未使用的资源。
- 压缩图片。
- 选择性地提供不同分辨率的图片资源。
- 重用资源。
- 使用代码绘制代替大量图片。
4. 对称加密与非对称加密在 Android 与服务器交互中的应用是什么?
- 对称加密:使用相同的密钥进行加密和解密,如 AES。
- 非对称加密:使用公钥加密,私钥解密。如 RSA。用于安全地交换密钥或签名数据。
5. 设备横竖屏切换时发生了什么?
- 不设置 android:configChanges 时,会重新调用生命周期方法。
- 设置 android:configChanges="orientation" 时,仍会重新调用生命周期方法,但次数减少。
- 设置 android:configChanges="orientation|keyboardHidden" 时,仅调用 onConfigurationChanged。
6. Service 的两种启动方式及其适用场景是什么?
- Started Service:通过 startService(Intent) 方法启动。当 Service 启动后,即使启动它的组件(如 Activity)已经销毁,Service 依然会在后台运行。适用于执行长时间运行的操作,如音乐播放、文件下载等。
- Bound Service:通过 bindService(Intent, ServiceConnection, int) 方法启动。客户端(如 Activity)可以与 Service 建立连接,进行交互。适用于需要频繁与 Service 通信的场景,如远程过程调用(RPC)。
7. 如何理解 Android 中的 Context?
Context 是一个抽象类,它允许访问应用程序特定的资源和类,以及调用应用程序级别的操作,如启动活动、广播和接收意图等。常见的 Context 实现包括 Application、Activity、Service 等。
8. Service 的 onCreate 是否在 UI 线程中执行?
否。Service 默认运行在主线程(UI 线程)中。因此,在 Service 中执行耗时操作时,需要注意不要阻塞主线程,通常建议开启子线程处理耗时任务。
9. AsyncTask 的工作原理及适用场景是什么?
AsyncTask 是一个轻量级的异步类,用于在后台线程执行任务,并将结果发布到 UI 线程。它内部使用线程池来管理任务的执行,并提供简单的回调接口来处理任务的开始、进度和结束。适用于简单的后台任务,如网络请求、数据库操作等。但不适合执行长时间运行或复杂的后台任务。
10. 对 Binder 机制有何理解?
Binder 是 Android 进程间通信(IPC)的一种机制。它允许在不同进程或线程之间传递对象和方法调用。通过 Binder,客户端可以跨进程调用服务端的方法,就像调用本地对象的方法一样。Binder 机制基于 C/S 架构,服务端通过 Binder 驱动注册服务,客户端通过 Binder 驱动获取服务端的代理对象,从而进行通信。
11. Android 中进程间通信的实现方式有哪些?
Android 中进程间通信(IPC)的实现方式包括:
- Binder:如上所述,用于跨进程对象和方法调用。
- Content Provider:允许不同应用程序之间共享数据。
- Broadcast Receiver:用于发送和接收广播消息。
- Intent:用于不同组件(如 Activity、Service 等)之间的通信。
- AIDL(Android Interface Definition Language):用于定义跨进程接口。
- Socket:基于网络协议的通信方式,适用于不同设备或不同应用之间的通信。
12. 自定义 View 的基本创建流程是怎样的?
- 继承 View 或其子类:根据需要选择合适的基类。
- 重写构造方法:初始化 View 的属性。
- 重写 onDraw 方法:绘制 View 的内容。
- 处理事件:重写如 onClick、onTouch 等事件处理方法。
- 测量和布局:重写 onMeasure 和 onLayout 方法,控制 View 的大小和位置。
13. Android 中的 touch 事件传递机制是怎样的?
在 Android 中,touch 事件的传递遵循以下顺序:
- Activity:首先接收到 touch 事件。
- ViewGroup:如果 touch 事件发生在 ViewGroup 内部,ViewGroup 会根据其子 View 的布局参数和触摸点的位置,决定将事件传递给哪个子 View。
- View:最终子 View 接收到 touch 事件,并处理它。
这个过程中涉及到的方法包括 onInterceptTouchEvent(用于决定是否拦截事件)和 onTouchEvent(用于处理事件)。
14. Android 中如何实现多线程?
Android 中实现多线程的方式有多种,包括:
- Thread 类:通过继承 Thread 类并重写 run 方法来实现。
- Runnable 接口:实现 Runnable 接口并重写 run 方法,然后将 Runnable 对象传递给 Thread 的实例来执行。
- 线程池:使用 ExecutorService 创建线程池,通过提交 Runnable 或 Callable 任务来执行多线程操作。
- AsyncTask:如上所述,适用于简单的后台任务。
15. 何时在 Android 开发中使用多进程?多进程的好处是什么?
在 Android 开发中,当应用程序需要执行耗时操作或需要与其他应用程序隔离时,可以考虑使用多进程。多进程的好处包括:
- 性能优化:将耗时操作放在单独的进程中执行,避免阻塞主线程,提高应用性能。
- 安全性:通过将敏感操作放在单独的进程中执行,增加应用程序的安全性。
- 资源隔离:不同进程之间的资源是相互隔离的,可以防止资源竞争和死锁等问题。
16. 什么是 ANR?如何避免和解决 ANR?
ANR (Application Not Responding) 是应用无响应的缩写。当应用在 5 秒内没有响应输入事件或 10 秒内没有完成 BroadcastReceiver 时,系统会弹出 ANR 对话框。避免方法包括:不要在主线程执行耗时操作,使用异步任务,优化复杂计算,及时释放资源。
17. 解决滑动冲突的常见策略有哪些?
- 外部拦截法:由父容器判断是否拦截。
- 内部拦截法:由子 View 判断是否消耗事件。
- 结合两者:根据具体场景灵活处理。
18. 如何将应用设置为系统应用?
- 将 APK 放入 /system/app 或 /system/priv-app 目录。
- 修改 AndroidManifest.xml 中的 sharedUserId 为系统用户 ID。
- 需要系统签名权限。
19. Android 内存泄露的研究
内存泄露是指程序在申请内存后,无法释放已申请的内存空间,导致可用内存减少,严重时会导致 OOM。常见原因包括静态变量持有 Context、未注销的监听器、单例模式使用不当等。
20. 内存泄露的检测方法有哪些?
- 使用 MAT (Memory Analyzer Tool) 分析 Dump 文件。
- 使用 LeakCanary 库自动检测。
- 使用 Android Studio Profiler 监控内存变化。
面试知识体系概览
第一章 Java 方面
- Java 基础部分
- Java 集合
- Java 多线程
- Java 虚拟机
第二章 Android 方面
- Android 四大组件相关
- Android 异步任务和消息机制
- Android UI 绘制相关
- Android 性能调优相关
- Android 中的 IPC
- Android 系统 SDK 相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin 方面
第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?
第四章 Flutter 高频面试题
- Dart 部分
- Flutter 部分
第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串
第六章 Android Framework 方面
- 系统启动流程面试题解析
- Binder 面试题解析
- Handler 面试题解析
- AMS 面试题解析


