安卓蓝牙和WakeLock的关系

22

我正在开发一款Android应用程序,它可以在后台运行并支持蓝牙配件。我希望能够在后台持续侦听蓝牙设备,并尝试与手机建立套接字连接。我的问题是,在没有持续保持部分唤醒的情况下是否可能实现这一点,因为那显然会对电池产生严重影响。所以我想知道蓝牙对手机休眠的影响是什么。当存在一个开放的蓝牙套接字时,手机是否仍然保持唤醒状态?如果一个设备尝试连接,蓝牙芯片是否会自动唤醒Android?我已经尝试进行一些测试来回答这些问题,但很难确定唤醒锁定的情况;此外,我不知道我观察到的行为是否可靠,或者它是否会因其他设备而改变。


你在此期间是否找到了答案或其他额外的信息?如果有,请发布它们,因为我目前正面临完全相同的问题。 - Jan Schejbal
蓝牙连接应该比非睡眠设备使用更多的电池,因此请保持唤醒锁定,因为您将会消耗电池(但不像Wi-Fi那样严重)。 - NikkyD
这是BLE 4.x还是普通蓝牙? - zrgiu
3个回答

2

如果您的应用程序正在运行且线程处于serverSocket.accept()方法中,则传入连接会唤醒手机,因此无需使用wakelocks。但是,请确保您的服务在前台并且不被系统杀死。


1
同样适用于BLE。如果您使用autoconnect=true调用connectGatt(),当外围设备接受连接时,手机将会唤醒。不需要wakelock。我没有去检查这种行为是否会防止CPU进入深度睡眠。 - Mark Ch
1
只是为了明确起见,后台服务也可以正常工作,特别是如果它被设置为STICKY。设备仍然会唤醒。使用前台的原因是为了尽可能地避免由于低资源而被杀死。 - Mark Ch

0

如果你正在为基于Marshmallow或更高版本的设备开发它,那么有DOZE模式来处理这种情况。因此,你不需要担心这些问题。它可以使用适当的机制处理WAKE_LOCK。


-3

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

因此,后台进程将消耗一些电力和电池寿命,并且它还负责部分唤醒Android(部分唤醒,因为它是后台进程,您始终可以控制它多频繁地检查传入连接)。通常情况下,这个后台进程并不总是运行,只有在Android中打开蓝牙时才会运行。因此,您还可以创建一个线程,该线程仅在Android中打开蓝牙时运行,否则应处于睡眠状态。


1
我刚刚测试过,似乎在Galaxy Nexus(作为“服务器”)上,传入的蓝牙连接确实会唤醒设备。(对于向Wifi IP发送ICMP Ping也是同样的情况)。 - Jan Schejbal
在Nexus 4上似乎也是这样,但我不能百分之百确定,因为该设备也喜欢无缘无故地唤醒。至少它总是在需要时唤醒。在Android 2.3.3设备(Galaxy Ace)上,它会在双方触发可见配对请求,使其无用(因此测试唤醒毫无意义)。 - Jan Schejbal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接