以下是Android开发中Wi-Fi与蓝牙相关的常见面试题及其要点整理,便于快速复习核心概念。
一、Wi-Fi 相关面试题
-
Wi-Fi 的基本工作流程是怎样的?
• 扫描:通过 WifiManager.startScan() 扫描可用热点。
• 获取结果:通过 BroadcastReceiver 监听 SCAN_RESULTS_AVAILABLE_ACTION 获取扫描结果。
• 连接:通过 WifiConfiguration 配置网络(SSID、密码、加密方式),调用 WifiManager.addNetwork() 和 WifiManager.enableNetwork() 进行连接。
• 状态监听:监听 WIFI_STATE_CHANGED_ACTION 和 SUPPLICANT_CONNECTION_CHANGE_ACTION 来获取连接状态变化。
-
如何以编程方式打开/关闭 Wi-Fi?
• 注意:从 Android 10(API 29)开始,直接开关 Wi-Fi 受限。常用方式:
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
// 打开 Wi-Fi(API 29 以下有效)
wifiManager.setWifiEnabled(true);
• 更高版本建议:引导用户前往系统设置页面操作。
-
如何获取当前连接的 Wi-Fi 信息?
WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
String ssid = wifiInfo.getSSID(); // 热点名称(带引号)
int ipAddress = wifiInfo.getIpAddress(); // IP 地址(整形)
int signalLevel = WifiManager.calculateSignalLevel(wifiInfo.getRssi(), 5); // 信号强度
-
Android 10+ 中 Wi-Fi 权限有何变化?
• 精确定位权限:扫描 Wi-Fi 需要 ACCESS_FINE_LOCATION 权限(因为 Wi-Fi 扫描可用于位置追踪)。
• 限制后台扫描:应用在后台时,Wi-Fi 扫描次数受限。
• 无法直接开关 Wi-Fi:普通应用无法直接调用 setWifiEnabled()。
二、蓝牙(Bluetooth)相关面试题
-
经典蓝牙(Bluetooth Classic)和低功耗蓝牙(BLE)的主要区别?
• 经典蓝牙:用于持续数据流传输(如音频、文件),功耗较高。
• BLE:用于间歇性数据传输(如传感器、手环),功耗极低。
• 协议差异:经典蓝牙使用 SPP、A2DP 等协议;BLE 使用 GATT(Generic Attribute Profile)进行数据交换。
-
使用经典蓝牙的基本步骤?
• 获取 BluetoothAdapter:
BluetoothAdapter bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
• 开启蓝牙:
// 方式一:直接开启(需 BLUETOOTH_ADMIN 权限)
bluetoothAdapter.enable();
// 方式二:请求用户开启(推荐)
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
• 发现设备:
bluetoothAdapter.startDiscovery(); // 监听 ACTION_FOUND 获取设备
• 配对与连接:
◦ 通过 BluetoothDevice.createBond() 发起配对。
◦ 使用 BluetoothSocket 进行数据传输。
-
BLE 开发中的核心类与流程?
• BluetoothGatt:中央设备(Client)用于与 BLE 外设通信的核心类。
• 主要步骤:
- 扫描设备:通过 BluetoothLeScanner.startScan() 扫描 BLE 设备。
- 连接设备:通过 BluetoothDevice.connectGatt() 建立连接,返回 BluetoothGatt 实例。
- 发现服务:调用 BluetoothGatt.discoverServices()。
- 读写数据:通过 BluetoothGattCharacteristic 读写特征值(Characteristic)。
- 监听通知:通过 BluetoothGatt.setCharacteristicNotification() 启用通知,接收数据。
- 断开连接:调用 BluetoothGatt.disconnect() 和 close()。
-
如何实现 BLE 设备的后台连接?
• 使用前台服务:在后台保持连接时,需启动前台服务并显示通知(Android 8.0+ 要求)。
• 优化重连逻辑:监听 BluetoothGattCallback.onConnectionStateChange(),实现断线重连。
• 注意限制:Android 6.0+ 对后台扫描有限制;Android 10+ 需要 ACCESS_FINE_LOCATION 权限。
-
蓝牙权限配置有哪些?
• 经典蓝牙:
• BLE:
三、综合与优化问题
-
如何兼容不同 Android 版本的蓝牙/Wi-Fi 特性?
• 运行时权限检查:针对 Android 6.0+ 动态申请位置权限。
• API 版本判断:使用 Build.VERSION.SDK_INT 分支处理不同 API 的行为差异。
• 使用 Jetpack Security 或替代方案:如 Wi-Fi 开关受限时,引导用户跳转设置。
-
蓝牙或 Wi-Fi 连接失败的可能原因?
• 权限不足:未申请或用户拒绝必要权限(如位置权限)。
• 未开启硬件:蓝牙或 Wi-Fi 未打开。
• 配对/配置错误:密码、加密方式不匹配(Wi-Fi);设备未配对或配对已失效(蓝牙)。
• 系统限制:后台扫描/连接被系统限制(省电模式、后台限制)。
• 距离或干扰:信号弱或存在干扰。
-
如何降低蓝牙/Wi-Fi 功能的功耗?
• 及时释放资源:扫描完成后立即停止;断开连接后关闭 BluetoothGatt/WifiManager 相关资源。
• 减少扫描频率:使用 SCAN_MODE_LOW_POWER 模式(BLE)。
• 使用 JobScheduler/WorkManager:将后台扫描任务合并在一个周期内执行。
四、高频实战问题
-
在 Android 10 及以上,为什么 Wi-Fi 扫描需要位置权限?
• 因为 Wi-Fi 扫描结果(如 BSSID、信号强度)可用于推断设备位置,属于敏感信息。
-
BLE 连接中的 MTU 是什么?如何修改?
• MTU(Maximum Transmission Unit)指一次传输的最大数据长度。可通过 BluetoothGatt.requestMtu() 请求更大的 MTU(最高 512 字节),提升传输效率。
-
如何保持 BLE 连接在后台稳定?
• 使用前台服务;设置高优先级连接;处理系统广播(如 ACTION_SCREEN_OFF)来维持连接。
-
Wi-Fi 直连(P2P)的基本流程?
• 通过 WifiP2pManager 发现附近设备、创建组、连接设备,并通过 Socket 传输数据。
以上内容覆盖了 Android 开发中 Wi-Fi 与蓝牙的核心知识点与高频面试题,建议结合官方文档和实际编码加深理解。祝你面试顺利!