我正在构建一个Android应用程序来控制智能手机的电源插座。这款应用的特色是Android Wear应用,因此人们可以直接从手腕上控制他们的灯。
当用户想要控制灯光时,我通过MessageApi
从智能手表发送一个字符串动作到智能手机,智能手机在WearableListenerService
中接收这个动作,并将适当的网络信号发送到AsyncTask
中的电源插座/网关。
只要手机没有长时间处于空闲状态,这就可以正常工作。然而,如果手机在桌子上放得太久,并且瞌睡开始了,Wear的动作执行得很慢,有时甚至根本不执行。我想这在某种程度上是有意为之的行为,但在我的情况下,这是不切实际的,因为如果用户想进入一个黑暗的房间,他不能等那么久才打开灯。
我知道如果你不在doze白名单上,那么doze会完全切断除FCM/GCM之外的所有网络。但是,即使我的应用程序在这个白名单上,并且网络部分工作,在手机上执行操作也需要很长时间。
我的具体问题是:处理这种情况的推荐方法是什么?在这种情况下,来自可穿戴设备的操作需要通过网络在处于休眠模式的连接智能手机上完成?
是否有一种方法可以快速退出瞌睡,以便更快地执行由可穿戴伴侣应用程序触发的计算?
我知道AlarmManager
有一种新方法,即使在打瞌睡模式下也能工作,但这也会修复处理延迟吗?在收到MessagApi
的MessageEvent
后发出警报对我来说似乎是一种变通方法。
或者AsyncTask
只是处理后台网络的错误方式,这就是延迟的来源?
实际上,有几个选项,你可以做,以处理打瞌睡的效果,如在适应你的应用程序打瞌睡。您可能需要考虑以下选项:
-
如果你的应用需要一个持久的网络连接来接收消息,你应该使用谷歌云消息(GCM),如果可能的话。
GCM通过高优先级GCM消息优化为与打盹和应用程序待机空闲模式一起工作。 GCM高优先级消息可以让你可靠地唤醒你的应用程序访问网络,即使用户的设备处于休眠状态或应用程序处于应用程序待机模式
-
为了帮助调度警报,Android 6.0 (API级别23)引入了两个新的
AlarmManager
方法:setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
。通过这些方法,您可以设置闹钟,即使设备处于休眠状态也会触发。但是,请注意,使用这些方法,
setAndAllowWhileIdle()
和setExactAndAllowWhileIdle()
都不能每9分钟发出一次以上的警报。
请尝试优化小睡和应用程序待机以获得更详细的信息或讨论。
除了这些给定的文档之外,在开发人员潜入小睡模式中也给出并讨论了处理小睡的相同选项,这可能也会有所帮助。