【问题标题】:Wear Actions execute very slow or not at all when phone is in doze mode当手机处于打盹模式时,Wear Actions 执行速度非常慢或根本不执行
【发布时间】:2016-08-30 01:12:15
【问题描述】:

我正在构建一个 Android 应用程序来使用智能手机控制电源插座。该应用具有 Android Wear 应用,因此人们可以直接通过手腕控制灯光。

当用户想要控制一盏灯时,我通过 MessageApi 从智能手表向智能手机发送一个字符串动作,智能手机在 WearableListenerService 中接收此动作并将适当的网络信号发送到电源插座/网关一个AsyncTask

只要手机没有闲置太久,它就可以正常工作。但是,如果手机在桌面上停留的时间过长,并且在 Wear 中打瞌睡,动作确实执行得非常慢,有时甚至根本不执行。我想这部分是预期的行为,但在我的情况下这是不切实际的,因为如果用户想进入一个黑暗的房间,他不能等待他的灯打开。

我知道,如果您不在 doze 白名单中,doze 会完全切断除 FCM/GCM 之外的所有网络。但即使我的应用在此白名单中并且网络部分正常工作,操作也可能需要很长时间才能在手机上执行。

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

有没有办法快速退出打瞌睡,以便更快地执行由可穿戴伴侣应用触发的计算?

我知道AlarmManager 有一种新方法,即使在打瞌睡模式下也能正常工作,但这也能解决处理延迟问题吗?在收到来自MessagApiMessageEvent 后发出警报对我来说似乎是一种解决方法。

或者可能是 AsyncTask 只是处理后台网络的错误方式,这就是延迟的来源?

【问题讨论】:

  • 当手机处于打盹状态时,Message API onMessageReceived 事件是否会立即触发?或者这就是延迟的原因?
  • 我现在更改了我的网络代码以使用 IntentService 来执行此类操作,看起来它对事情有所改善。 @String 是的 onMessageReceived 确实(几乎)立即触发。我可以在打瞌睡时控制灯光。在我的代码中,当互联网可用时,我决定使用 WAN 还是 LAN/WLAN。这项检查(互联网是否可用)似乎需要相当长的时间并且检查失败,即使我的应用在白名单中并且互联网应该可用。

标签: wear-os android-doze


【解决方案1】:

实际上,您可以通过一些选项来处理 Adapting your app to Doze 中给出的 Doze 效果。您可能需要考虑以下选项:

  1. 如果您的应用需要持久连接到网络来接收消息,则应尽可能使用 Google Cloud Messaging (GCM)。

    GCM 经过优化,可通过高优先级 GCM 消息处理打盹和应用待机空闲模式。 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 中也给出和讨论了处理打瞌睡的相同选项,这也可能有所帮助。

【讨论】:

  • 我需要连接到互联网(或至少是局域网),但不需要连接到我可以控制的服务器,因此不能选择 GCM(如果我理解正确的话)。我知道新的警报方法并且我已经使用它们了。他们工作正常。您是否建议这是处理此问题的正确方法?发出额外的警报?
猜你喜欢
  • 1970-01-01
  • 2019-12-27
  • 1970-01-01
  • 1970-01-01
  • 2013-04-08
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多