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 线程。它内部使用线程池来管理任务的执行,并提供简单的回调接口来处理任务的开始、进度和结束。适用于简单的后台任务,如网络请求、数据库操作等。但不适合执行长时间运行或复杂的后台任务。


