首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android蓝牙唤醒装置

Android蓝牙唤醒装置
EN

Stack Overflow用户
提问于 2016-02-26 09:20:46
回答 1查看 3.1K关注 0票数 0

我给自己买了一个运行安卓KitKat的智能手表。我用蓝牙连接到我的HTC m9智能手机上。我已经创建了一个在智能手表(客户端模式)和智能手机(服务器模式)上运行的应用程序。应用程序通过蓝牙套接字连接彼此交谈。

当我在手机上接到电话时,我通过蓝牙插座向手表发送蓝牙通知,并使其振动。

只要手表的CPU启动并运行,一切都是好的。当手表进入睡眠状态时,我在智能手机上接到一个电话,由于手表的CPU处于休眠状态,所以通知不会被手表处理。

在手表上使用部分锁可以做到这一点,但它消耗了电池的速度。我不需要部分锁定电话,因为当手机接到电话时,手机被“神奇地”唤醒,所以我的应用程序的服务能够发送通知。

我也不能在手表上使用AlarmManager,因为当我收到蓝牙套接字通知时,我需要手表醒过来,而不是定期的。

WakefullRecevier也不能解决这个问题,因为我的手表需要先醒来,这样WakefullReceiver才能打开电源锁(或者我弄错了?!)运行它的代码。

所以问题是:电话是如何在接到电话时醒来的?还是收到短信?是硬件thing..an中断吗?当收到蓝牙信息时,有没有办法唤醒手表?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-03-12 16:52:31

在过去的几天里,我一直在玩手表,做不同的测试。我没有回答原来的问题,但由于没有其他人回答这个问题,我只会写下我自己的结论,这些结论对我的申请来说是足够好的,也许还可以帮助其他人解决类似的问题。

1.当配对手表在手机的蓝牙范围内时,手表上不需要电源锁。任何由电话发送的信息都会被手表接收。如果手表闲置了一段时间,手机发送的第一条蓝牙消息将在大约1秒的延迟时间内被接收。Android手表可能会进入某种低功耗模式,但在收到蓝牙消息时可以运行我的代码。当然,蓝牙消息几乎立即被手表接收,而手表不是空闲的。

2.了解蓝牙套接字是否仍然连接的最佳方法是写入它。 socket read是一个阻塞调用,但当手表超出蓝牙范围时它不会抛出IOException。我找不到可以更改的读出超时属性。因此,我只是每60秒将一个字节写入套接字,以检测套接字是否已不再连接。电池冲击最小,而插座向下检测定时是可以接受的。

3.当配对手表不再在手机的蓝牙范围内时,就需要蓝牙套接字重新连接策略。在这种情况下,使用部分锁的似乎不是一个好方法,因为它使CPU保持清醒。此外,试图重新连接到经常到电话杀死电池。

重新连接策略是基于应用需求的。最后,我使用了WakefulBroadcastReceiverAlarmManager来尝试使用给定的句点进行套接字连接。

4.每当手表超出蓝牙范围,然后又回到蓝牙范围,蓝牙插座似乎就会出现在某种“僵尸”状态的中。有时,socket.connect调用只是阻塞而没有成功或抛出错误,还有一些时候,由于连接已经建立,socket.connect调用不会抛出错误,但是后续的写总是抛出IOException。每当我遇到这种情况时,我就会停止/启动蓝牙适配器,这似乎解决了问题。

5.注意停止/启动蓝牙适配器。在蓝牙重启尝试中可以使CPU进入睡眠状态。我没有料到这种行为,但它真的发生了。因此,如果您希望在没有任何延迟的情况下尽快完成此操作,请确保应用程序在重新启动尝试期间获得PARTIAL_WAKE_LOCK。当然,不要忘记尽快释放锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35647767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档