我给自己买了一台运行Android KitKat的智能手表。 我已经使用蓝牙将它连接到我的HTC m9智能手机。 我创建了一个在智能手表(客户端模式)和智能手机(服务器模式)上运行的应用程序。 应用程序通过蓝牙套接字连接相互通信。
当我在手机上接听电话时,我正通过蓝牙插座向手表发送蓝牙通知并使其振动。
只要手表的CPU启动并运行,一切都很好。 当手表进入睡眠状态并且我在智能手机上接到电话时,手表不会处理通知,因为手表的CPU处于睡眠状态。
在手表上使用部分锁定可以做到这一点,但它会快速消耗电池。 我不需要对手机进行部分锁定,因为当手机接到电话时,手机被“神奇地”唤醒,因此我的应用程序服务可以发送通知。
我也不能在手表上使用AlarmManager,因为我需要手表在我收到蓝牙插座通知时醒来,而不是定期。
WakefullRecevier也没有解决问题,因为我的手表需要先唤醒,以便WakefullReceiver置入电源锁(或者我错了?!)并运行其代码。
所以问题是:手机如何在来电时醒来?或收到短信?这是一件硬件......中断? 收到蓝牙信息时有没有办法唤醒手表?
谢谢
答案 0 :(得分:0)
在过去的几天里,我一直在玩手表进行不同的测试。 我没有回答原来的问题,但由于没有其他人回答这个问题,我只会写下我自己的结论,这些结论对我的申请来说足够好,也许可以帮助其他有类似问题的人。
<强> 1。当配对的手表处于手机的蓝牙范围内时,手表上不需要电源锁。 手表发送的任何消息都由手表接收。 如果手表闲置一段时间,手机发送的第一条蓝牙信息将被接收,延迟时间约为1秒。 Android手表可能会进入某种低功耗模式,但是在收到蓝牙消息时可以运行我的代码。当然,当手表没有闲置时,手表几乎会立即收到蓝牙信息。
<强> 2。找出蓝牙插座是否仍然连接的最佳方法是写入。
套接字读取是一个阻塞调用,但当监视器超出蓝牙范围时,它不会抛出IOException
。我无法找到可以更改的读取超时属性。
所以我只是每隔60秒在套接字中写一个字节来检测套接字是否已经连接。电池影响最小,而插座检测时间可以接受。
第3。当配对的手表不再位于手机的蓝牙范围内时,需要蓝牙插座重新连接策略。 在这种情况下使用部分锁定似乎不是一个好方法,因为它使CPU保持清醒。此外,尝试重新连接到手机也会导致电池烧毁。
重新连接策略基于应用程序需求。
我最终使用WakefulBroadcastReceiver
和AlarmManager
在给定时间段内进行套接字连接尝试。
<强> 4。时不时地,当手表超出蓝牙范围,然后再回到范围内,然后蓝牙插座一次又一次地出现在某种“僵尸”中。状态即可。有时socket.connect
调用只是阻塞而没有成功或抛出错误,有时候socket.connect
调用不会抛出错误,因为已经建立了连接的印象,但后续写入总是抛出IOException
。
每当遇到这种情况时,我就停止/启动蓝牙适配器,这似乎可以解决问题。
<强> 5。注意停止/启动蓝牙适配器。在蓝牙重启尝试期间,Android可以让CPU进入睡眠状态。我并不期待这种行为,但确实发生了。因此,如果您希望尽可能快地执行此操作,请确保应用程序在重新启动尝试期间获取PARTIAL_WAKE_LOCK
。当然不要忘记尽快释放锁。