2011-08-10 70 views
21

我正在研究一个在后台运行的Android应用程序,并支持蓝牙配件。我想不断地在后台监听蓝牙设备尝试打开手机的插座。我的问题是,是否有可能实现这一点,而不是始终保持部分唤醒锁,因为这显然会造成严重的电池后果。所以我想知道的是蓝牙在手机上睡着的效果。有一个开放的蓝牙插座时,手机保持清醒状态吗?如果设备尝试连接,蓝牙芯片会自动唤醒Android吗?我试图做一些测试来回答这些问题,但是很难将唤醒锁发生什么情况。此外,我不知道我是否可以依赖我观察到的行为,或者如果它在其他设备上发生变化。Android蓝牙和WakeLock关系

+0

您是否在此期间找到答案或任何其他信息?如果是这样,请张贴他们,因为我目前有完全相同的问题。 –

+0

bt连接应该使用比非睡眠设备更多的电池,所以请持有一个唤醒电池,因为您将耗尽电池(但不像无线网络那样糟糕) – NikkyD

+0

是这个BLE 4.x还是普通蓝牙? – zrgiu

回答

-2

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

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

+0

我刚测试过它,似乎在Galaxy Nexus上(作为“服务器”),传入的蓝牙连接确实会唤醒设备。 (发送ICMP Ping到Wifi IP也是如此)。 –

+0

在Nexus 4上它似乎也是这样,但我无法100%确定,因为该设备也喜欢醒来没有明显的原因。至少它总是在需要时醒来。使用Android 2.3.3设备(Galaxy Ace),它会触发双方的可见配对请求,使其无用(因此测试唤醒毫无意义)。 –

1

是的,如果您的应用程序正在运行并且线程在serverSocket.accept()方法中,则传入的连接会唤醒电话,因此不需要使用唤醒锁。但是,请确保您的服务位于前台并且不会被系统中止。

+0

BLE也是如此。如果您使用autoconnect = true调用connectGatt(),当外设接受连接时,手机将唤醒。不需要唤醒锁。我没有仔细检查这种行为是否会阻止CPU进入深度睡眠状态。 –

+1

只是为了清楚起见,后台服务也可以正常工作,尤其是如果它是STICKY。该设备仍会唤醒。使用前景的原因是为了尽可能地避免因资源不足而被杀害 –

0

如果您正在开发针对基于棉花糖或以上棉花糖的设备,则可以使用DOZE模式来处理此类情况。然后你不必担心这些事情。它可以用适当的机制处理WAKE_LOCK。