【问题标题】:WearableListenerService, onDataChanged() is not calledWearableListenerService, onDataChanged() 没有被调用
【发布时间】:2014-08-05 14:16:37
【问题描述】:

我按照教程从手机调用可穿戴活动,发布在此处How to send notification from handheld to wear to open Activity on wear device。但是,我从答案中获取源代码。但是,我无法让它运行。看起来onDataChanged() 从未被调用过。我将其作为一个问题单独提出,因为该示例似乎对其他人有用。 如果这很重要,我正在使用 KitKat 4.4.2。

任何提示在哪里检查,谢谢。

【问题讨论】:

  • this answer 中的示例代码和 Android 示例的问题是发送的数据项不够唯一。在官方示例中,数据项包含格式为 HH:mm 的时间,这使得它每分钟都是唯一的。如果您将通知滑开,则只能在该分钟结束后发送新通知。我的样品有同样的问题,我现在已经修复了。我们还提交了另一个示例的错误。

标签: android wear-os


【解决方案1】:

您可以检查两件事:

  • 穿戴应用的packageName 应与设备应用的packageName 相同
  • onDataChanged() 仅在数据真正改变时被调用。如果多次将相同的数据放入DataApi,该方法只会调用一次,直到写入不同的数据。您可以为数据添加时间戳,以确保每次写入操作都会调用一次该方法。但是,就电池使用而言,使用 DataApi 可能比发送消息更昂贵。因此,如果您只想在将数据放入 DataApi 后触发操作,只需在完成后发送一条消息即可。

【讨论】:

  • 一遍又一遍地将相同的数据发送到 onDataChanged() 对我来说是这样做的。谢谢!
  • 我在测试期间添加了dataMap.getDataMap().putLong("Time",System.currentTimeMillis()); 以保证更改。
  • 你拯救了我的一天!谢谢!
  • 您还需要注意另一件事。 DataItems 的有效负载限制为 100KB。如果您的 DataItem 超过此限制,则也不会调用 onDataChanged()。
【解决方案2】:

使用 8.3.0 版的 Play 服务,消息最多可以延迟 30 分钟。使用新的 setUrgent() 方法可以立即发送。

最后,如果您正在开发可穿戴设备,您会知道电池寿命和电源使用优化对于获得出色的用户体验至关重要。在 Google Play 服务 8.3 中,我们更新了 DataApi 以考虑同步数据项的紧迫性。现在,可以将优先级添加到数据项以确定何时应同步。例如,如果您正在构建需要立即同步的应用程序,例如远程控制应用程序,仍然可以通过调用 setUrgent() 立即完成,但对于更新联系人等操作,您可以容忍一些延迟。非紧急数据项最多可能会延迟 30 分钟,但您可以预期,在大多数情况下,它们会在几分钟内送达。现在默认是低优先级,所以需要setUrgent()来获取之前的时序。

http://android-developers.blogspot.nl/2015/11/whats-new-in-google-play-services-83.html

【讨论】:

  • 调查了两天,没找到这个。感谢上帝你提到它,在 GMS 8.3 内部消息被延迟,特别是在磨损模拟器上。使用这个 setUrgent() 它可以正常工作。
【解决方案3】:

确保 build.gradle 文件中的 applicationId 与您的手持设备和可穿戴模块相同

apply plugin: 'com.android.application'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"

    defaultConfig {
        applicationId "your.applicationid" // needs to be the same in both modules
        minSdkVersion 20
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
        targetCompatibility = '1.7'
}

...

【讨论】:

    【解决方案4】:

    对我来说,罪魁祸首是服务声明中的这一行:

    android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
    

    我不确定这条线是什么导致服务不接收事件,但是当它被删除后它开始正常运行。

    【讨论】:

    • 您是仅从穿戴应用程序中删除还是从移动设备中删除?
    • @JPVentura 可惜我不记得了
    【解决方案5】:

    1.检查 build.gradle for mobile 和 wear 是否有相同的播放版本 compile 'com.google.android.gms:play-services-wearable:6.5.87'

    我的手机上有一个 + 号,它只在手机上使用了最新版本

    在两者上升级相同的版本,直到它可以工作

    2.愚蠢的解决方法,如果没有任何效果(!!这适用于不同的游戏版本,如果你做了第一步,你就不需要这个)

    ....
    Wearable.DataApi.putDataItem(mGoogleApiClient, request)
    .......  
    this line after your put
    
    Wearable.DataApi.deleteDataItems(mGoogleApiClient, request.getUri());
    

    这是一个复制技巧,可以做 3 件事:

    • 唤醒对

    • 发送数据

    • 使用良好的数据对两者执行 OnDataChange

    • 删除数据(在没有数据的情况下对两者执行 OnDataChange)(因此即使在数据被删除后也要准备工作)

    我的问题是数据在手表上排队并暂停,直到第一次触摸 - 现在它是实时双向的

    【讨论】:

      【解决方案6】:

      如果您使用的是 Android Wear 模拟器,请确保手机上的 Android Wear 应用已连接到模拟器并运行 adb tcp forwarding 命令。

      更多细节在这里:https://stackoverflow.com/a/25506889/1044864

      【讨论】:

        【解决方案7】:

        在onDataChanged方法之后,我强制

        onDataChanged(DataEventBuffer 数据事件) {

        --doDataStuff---

        mGoogleApiClient.disconnect(); mGoogleApiClient.connect();

        }

        只有使用此设置,onDataChanged 才对我有用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-20
          相关资源
          最近更新 更多