【问题标题】:Android Bluetooth & WakeLock relationshipAndroid 蓝牙 & WakeLock 的关系
【发布时间】:2011-08-10 16:11:44
【问题描述】:

我正在开发一个在后台运行并支持蓝牙配件的 Android 应用程序。我想一直在后台监听蓝牙设备以尝试打开手机的套接字。我的问题是是否有可能在不不断保持部分唤醒锁的情况下实现这一目标,因为这显然会产生严重的电池后果。所以我想知道的是蓝牙对手机入睡有什么影响。蓝牙插座打开时手机是否保持唤醒状态?如果设备尝试连接,蓝牙芯片是否会自动唤醒 Android?我试图做一些测试来回答这些问题,但是很难隔离唤醒锁发生的事情。此外,我不知道我是否可以依赖我观察到的行为,或者它是否会在其他设备上发生变化。

【问题讨论】:

  • 在此期间您是否找到了答案或任何其他信息?如果是这样,请发布它们,因为我目前遇到了完全相同的问题。
  • bt 连接应该比非睡眠设备使用更多的电池,所以请保持唤醒锁,因为你会耗尽电池(但不如 wifi)
  • 这是 BLE 4.x 还是普通蓝牙?

标签: android android-bluetooth android-wake-lock


【解决方案1】:

是的,如果你的应用程序正在运行并且一个线程在 serverSocket.accept() 方法中,传入的连接会唤醒电话,所以不需要使用唤醒锁。但是,请确保您的服务在前台并且没有被系统杀死。

【讨论】:

  • BLE也是如此。如果您使用 autoconnect=true 调用 connectGatt(),则当外围设备接受连接时,手机将唤醒。不需要唤醒锁。我没有费心去检查这种行为是否会阻止 CPU 进入深度睡眠
  • 明确一点,后台服务也可以正常工作,尤其是在设置为 STICKY 的情况下。设备仍会唤醒。使用前台的原因是尽可能避免由于资源不足而被杀死
【解决方案2】:

如果您正在为基于棉花糖或更高版本的设备开发它,则可以使用打盹模式来处理此类情况。然后,您不必担心这些事情。它可以通过适当的机制处理 WAKE_LOCK。

【讨论】:

    【解决方案3】:

    如果蓝牙插座打开,手机不会保持唤醒状态,如果设备尝试连接,蓝牙芯片也不会唤醒 Android。通常有一个后台线程在运行以接受开放端口上的连接,一旦设备尝试连接,正是这个线程读取连接,从传入设备获取某种身份验证(我假设有一个安全协议来接受任何新的传入连接),一旦传入的连接通过身份验证,就会创建/通知一个独立线程来处理与该线程的后续信息交换。

    所以后台进程会消耗一些电量和电池消耗,它还负责保持 Android 部分唤醒(部分作为后台进程,您始终可以控制它检查传入连接的频率)。通常这个后台进程并不总是运行,它只有在 Android 中打开蓝牙时才会运行。因此,您还可以创建一个线程,该线程仅应在 Android 中打开蓝牙时运行,否则应休眠。

    【讨论】:

    • 我刚刚对其进行了测试,似乎在 Galaxy Nexus(作为“服务器”)上,传入的蓝牙连接确实会唤醒设备。 (向 Wifi IP 发送 ICMP Ping 也是如此)。
    • 在 Nexus 4 上似乎也是如此,但我不能 100% 确定,因为设备也喜欢无缘无故地醒来。至少它总是在需要的时候醒来。使用 Android 2.3.3 设备 (Galaxy Ace),它会在双方触发可见的配对请求,使其无用(因此测试唤醒毫无意义)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多