android -wifi/蓝牙-常见面试题

以下是Android开发中Wi-Fi与蓝牙相关的常见面试题及其要点整理,便于快速复习核心概念。

一、Wi-Fi 相关面试题

  1. Wi-Fi 的基本工作流程是怎样的?

    • 扫描:通过 WifiManager.startScan() 扫描可用热点。

    • 获取结果:通过 BroadcastReceiver 监听 SCAN_RESULTS_AVAILABLE_ACTION 获取扫描结果。

    • 连接:通过 WifiConfiguration 配置网络(SSID、密码、加密方式),调用 WifiManager.addNetwork() 和 WifiManager.enableNetwork() 进行连接。

    • 状态监听:监听 WIFI_STATE_CHANGED_ACTION 和 SUPPLICANT_CONNECTION_CHANGE_ACTION 来获取连接状态变化。

  2. 如何以编程方式打开/关闭 Wi-Fi?

    • 注意:从 Android 10(API 29)开始,直接开关 Wi-Fi 受限。常用方式:

    WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);

    // 打开 Wi-Fi(API 29 以下有效)

    wifiManager.setWifiEnabled(true);

    • 更高版本建议:引导用户前往系统设置页面操作。

  3. 如何获取当前连接的 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); // 信号强度

  4. Android 10+ 中 Wi-Fi 权限有何变化?

    • 精确定位权限:扫描 Wi-Fi 需要 ACCESS_FINE_LOCATION 权限(因为 Wi-Fi 扫描可用于位置追踪)。

    • 限制后台扫描:应用在后台时,Wi-Fi 扫描次数受限。

    • 无法直接开关 Wi-Fi:普通应用无法直接调用 setWifiEnabled()。

二、蓝牙(Bluetooth)相关面试题

  1. 经典蓝牙(Bluetooth Classic)和低功耗蓝牙(BLE)的主要区别?

    • 经典蓝牙:用于持续数据流传输(如音频、文件),功耗较高。

    • BLE:用于间歇性数据传输(如传感器、手环),功耗极低。

    • 协议差异:经典蓝牙使用 SPP、A2DP 等协议;BLE 使用 GATT(Generic Attribute Profile)进行数据交换。

  2. 使用经典蓝牙的基本步骤?

    • 获取 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 进行数据传输。

  3. BLE 开发中的核心类与流程?

    • BluetoothGatt:中央设备(Client)用于与 BLE 外设通信的核心类。

    • 主要步骤:

    1. 扫描设备:通过 BluetoothLeScanner.startScan() 扫描 BLE 设备。
    2. 连接设备:通过 BluetoothDevice.connectGatt() 建立连接,返回 BluetoothGatt 实例。
    3. 发现服务:调用 BluetoothGatt.discoverServices()。
    4. 读写数据:通过 BluetoothGattCharacteristic 读写特征值(Characteristic)。
    5. 监听通知:通过 BluetoothGatt.setCharacteristicNotification() 启用通知,接收数据。
    6. 断开连接:调用 BluetoothGatt.disconnect() 和 close()。
  4. 如何实现 BLE 设备的后台连接?

    • 使用前台服务:在后台保持连接时,需启动前台服务并显示通知(Android 8.0+ 要求)。

    • 优化重连逻辑:监听 BluetoothGattCallback.onConnectionStateChange(),实现断线重连。

    • 注意限制:Android 6.0+ 对后台扫描有限制;Android 10+ 需要 ACCESS_FINE_LOCATION 权限。

  5. 蓝牙权限配置有哪些?

    • 经典蓝牙:

    • BLE:

三、综合与优化问题

  1. 如何兼容不同 Android 版本的蓝牙/Wi-Fi 特性?

    • 运行时权限检查:针对 Android 6.0+ 动态申请位置权限。

    • API 版本判断:使用 Build.VERSION.SDK_INT 分支处理不同 API 的行为差异。

    • 使用 Jetpack Security 或替代方案:如 Wi-Fi 开关受限时,引导用户跳转设置。

  2. 蓝牙或 Wi-Fi 连接失败的可能原因?

    • 权限不足:未申请或用户拒绝必要权限(如位置权限)。

    • 未开启硬件:蓝牙或 Wi-Fi 未打开。

    • 配对/配置错误:密码、加密方式不匹配(Wi-Fi);设备未配对或配对已失效(蓝牙)。

    • 系统限制:后台扫描/连接被系统限制(省电模式、后台限制)。

    • 距离或干扰:信号弱或存在干扰。

  3. 如何降低蓝牙/Wi-Fi 功能的功耗?

    • 及时释放资源:扫描完成后立即停止;断开连接后关闭 BluetoothGatt/WifiManager 相关资源。

    • 减少扫描频率:使用 SCAN_MODE_LOW_POWER 模式(BLE)。

    • 使用 JobScheduler/WorkManager:将后台扫描任务合并在一个周期内执行。

四、高频实战问题

  1. 在 Android 10 及以上,为什么 Wi-Fi 扫描需要位置权限?

    • 因为 Wi-Fi 扫描结果(如 BSSID、信号强度)可用于推断设备位置,属于敏感信息。

  2. BLE 连接中的 MTU 是什么?如何修改?

    • MTU(Maximum Transmission Unit)指一次传输的最大数据长度。可通过 BluetoothGatt.requestMtu() 请求更大的 MTU(最高 512 字节),提升传输效率。

  3. 如何保持 BLE 连接在后台稳定?

    • 使用前台服务;设置高优先级连接;处理系统广播(如 ACTION_SCREEN_OFF)来维持连接。

  4. Wi-Fi 直连(P2P)的基本流程?

    • 通过 WifiP2pManager 发现附近设备、创建组、连接设备,并通过 Socket 传输数据。

以上内容覆盖了 Android 开发中 Wi-Fi 与蓝牙的核心知识点与高频面试题,建议结合官方文档和实际编码加深理解。祝你面试顺利!

相关推荐
XiaoLeisj1 小时前
Android Activity 页面导航基础:Manifest 声明、Intent 显式/隐式跳转与数据传递
android·java
littlegnal2 小时前
Flutter Android如何延迟加载代码
android·flutter
秋氘渔2 小时前
MySQL EXPLAIN实战:6种索引失效场景验证与优化
android·数据库·mysql·索引
钟睿2 小时前
HarmonyOS花瓣地图自定义点聚合功能
android·harmonyos·arkts
三少爷的鞋2 小时前
Android 协程时代,出现 ReentrantLock 就是架构警报
android
诸神黄昏EX2 小时前
seccomp策略
android
JiaoJunfeng3 小时前
Android AI开发 工具选择
android·ai 开发
summerkissyou19873 小时前
Android-audio-常见面试题
android·audio
程序员阿明3 小时前
spring security6+spring boot 3.5.9最新版本集成oauth2.1
android·spring boot·spring