WearableListenerService,onDataChanged()未被调用

时间:2014-08-05 14:16:38

标签: android wear-os

我按照教程从手机中调用了可穿戴活动,在How to send notification from handheld to wear to open Activity on wear device张贴。但是,我从答案中获取源代码。但是,我无法让它运行。看起来永远不会调用onDataChanged()。我问这个问题本身就是一个问题,因为看起来这个例子适用于其他人。 我正在使用KitKat 4.4.2,如果这很重要的话。

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

7 个答案:

答案 0 :(得分:46)

您可以检查两件事:

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

答案 1 :(得分:15)

使用版本8.3.0的Play服务,邮件可能会延迟最多30分钟。使用新的setUrgent()方法,它可以毫无延迟地发送。

  

最后,如果您正在为可穿戴设备开发,您将了解电池寿命和电源使用优化对于获得出色的用户体验至关重要。借助Google Play服务8.3,我们更新了DataApi,以便在数据项同步方面保持紧迫性。现在,可以向数据项添加优先级以确定何时应该同步它。例如,如果您正在构建一个需要立即同步的应用程序,例如远程控制应用程序,它仍然可以通过调用setUrgent()立即完成,但是对于诸如更新联系人之类的内容,您可以容忍一些延迟。非紧急DataItem可能会延迟最多30分钟,但您可以预期,在大多数情况下,它们将在几分钟内交付。低优先级现在是默认值,因此需要setUrgent()来获取先前的时间。

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

答案 2 :(得分:5)

确保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'
}

...

答案 3 :(得分:2)

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

android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"

我不完全确定此行的内容会导致服务无法接收事件,但是当它被删除时,它开始正常运行。

答案 4 :(得分:1)

  

1.检查build.gradle for mobile和for wear以使用相同的播放版本编译com.google.android.gms:play-services-wearable:6.5.87'

Mine在移动设备上有一个+号,它仅在移动设备上使用了最后一个版本

在两者上升级相同版本直到它起作用

  

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

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

Wearable.DataApi.deleteDataItems(mGoogleApiClient, request.getUri());

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

  • 唤醒对

  • 发送数据

  • 使用良好的数据执行OnDataChange

  • 删除数据(两者都没有数据执行OnDataChange)(所以即使删除了数据也准备工作)

我的问题是数据在第一次触摸时排队并暂停观看 - 现在它是实时双向的

答案 5 :(得分:0)

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

此处的其他详细信息:https://stackoverflow.com/a/25506889/1044864

答案 6 :(得分:-2)

在onDataChanged方法之后,我正在强制

onDataChanged(DataEventBuffer dataEvents){

- doDataStuff ---

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

}

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