2016-08-30 37 views
0

我正在构建一款Android应用程序,用于通过智能手机控制电源插座。该应用程序配备了Android Wear应用程序,用户可以从手腕上直接控制灯光。当手机处于打盹模式时,佩戴动作执行非常缓慢或根本不执行

当用户想要以控制光我发送经由MessageApi字符串作用从智能手表到智能电话,它接收在一WearableListenerService这个动作和相应的网络信号发送到电源插座/网关在AsyncTask

只要手机没有闲置太久,这种方式就可以正常工作。但是,如果手机在桌面上停留时间过长,并且在Wear服务中打瞌睡,则执行速度非常缓慢,有时甚至根本不会。我想这是部分意图的行为,但在我的情况下,这是不实际的,因为如果用户想进入黑暗的房间,用户无法等待很长一段时间才能打开灯。

我知道,如果您不在瞌睡白名单上,那么瞌睡会彻底切断除FCM/GCM之外的所有网络。但是,即使我的应用程序位于此白名单上,并且网络部分的工作操作可能需要很长时间才能在手机上执行。

所以我的具体问题是: 什么是处理这种情况的推荐方式,可穿戴式设备的动作需要通过网络在处于休眠模式的已连接智能手机上完成?

有没有办法退出打盹一段很短的时间,以更快地执行由可穿戴伴侣应用触发的计算?

我知道AlarmManager有一种即使在睡眠模式下也可以工作的新方法,但是这是否也会修复处理延迟?从MessagApi收到MessageEvent后发出警报似乎是对我的一种解决方法。

或者也许是一个AsyncTask只是错误的方式来处理后台网络,那是延迟来自哪里?

+0

马上要做消息API'onMessageReceived'事件火当手机处于打盹?或者这是什么延迟? – String

+0

现在我改变了我的网络代码,使用IntentService进行这种操作,似乎它改进了一些。 @String是的onMessageReceived不会立即触发(几乎)。瞌睡时我可以控制灯光。在我的代码中,我决定在互联网可用时使用WAN或LAN/WLAN。这个检查(可用因特网)似乎需要相当长的一段时间,并且检查失败,即使我的应用程序在白名单上并且Internet应该可用。 –

回答

0

实际上,您可以使用几个选项来处理打盹的效果,如Adapting your app to Doze中给出的。您可能需要考虑以下选项:

  1. 如果您的应用程序需要对网络持续连接接收消息,如果可能的话,你应该使用谷歌云消息传递(GCM)。

    GCM经过优化,可以通过高优先级的GCM消息与打盹和应用待机空闲模式一起工作。即使用户的设备处于打盹状态或应用程序处于App Standby模式,GCM高优先级消息也可让您可靠地唤醒您的应用以访问网络。

  2. 为了帮助安排警报,Android 6.0(API等级23)引入了两个新的AlarmManager方法:setAndAllowWhileIdle()setExactAndAllowWhileIdle()。使用这些方法,即使设备处于打盹状态,您也可以设置即将触发的警报。

    但是,请注意,使用这些方法,setAndAllowWhileIdle()setExactAndAllowWhileIdle()都不能每9分钟为每个应用启用一次以上的警报。

请尝试通过Optimizing for Doze and App Standby了解更多详细信息或讨论。

除了这些给定的文档,还分别获得在处理打盹相同的选项,并在其中Diving into Doze Mode for Developers也可能有助于讨论。

+0

我需要一台服务器到互联网(或至少LAN)连接,但不是我能控制的,从而GCM不是一个选项(如果我理解正确的话)。我知道新的警报方法,我已经使用它们。他们正常工作。你是否建议这是处理这个问题的正确方法?发射额外的警报? –