WearableListenerService, onDataChanged() не вызывается
Я следовал учебному пособию, чтобы вызвать переносное действие с телефона, опубликованное здесь. Как отправить уведомление с портативного устройства на износ, чтобы открыть действие на устройстве износа. Однако я беру исходный код из ответа. Тем не менее, я не мог заставить его работать. Это выглядит как onDataChanged()
никогда не называется. Я задаю это как вопрос сам по себе, потому что, кажется, пример работает для других. Я на KitKat 4.4.2, если это имеет значение.
Любой совет, где проверить, спасибо.
7 ответов
Есть две вещи, которые вы можете проверить:
packageName
приложения износа должно быть идентичноpackageName
приложения устройстваonDataChanged()
вызывается только тогда, когда данные действительно меняются. Если вы помещаете одни и те же данные в DataApi несколько раз, метод вызывается только один раз, пока вы не напишите другие данные. Вы можете добавить временную метку к данным, чтобы убедиться, что метод вызывается один раз для каждой операции записи. Однако использование DataApi потенциально дороже с точки зрения использования батареи, чем отправка сообщения. Поэтому, если вы просто хотите запустить действие после помещения данных в DataApi, просто отправьте сообщение, когда закончите.
В версии 8.3.0 Сервисов Play сообщения могут быть задержаны до 30 минут. С новым методом setUrgent() он отправляется без задержки.
Наконец, если вы разрабатываете для носимых устройств, вы будете знать, что срок службы батареи и оптимизация энергопотребления имеют решающее значение для обеспечения хорошего пользовательского опыта. В сервисах Google Play 8.3 мы обновили DataApi, чтобы обеспечить срочность синхронизации элементов данных. Теперь к элементу данных можно добавить приоритет, чтобы определить, когда он должен быть синхронизирован. Например, если вы создаете приложение, которое требует немедленной синхронизации, например приложение удаленного управления, это все же можно сделать немедленно, вызвав setUrgent(), но для чего-то, например, для обновления ваших контактов, вы можете допустить некоторую задержку. Несрочные DataItems могут быть отложены на срок до 30 минут, но вы можете ожидать, что в большинстве случаев они будут доставлены в течение нескольких минут. Низкий приоритет теперь является значением по умолчанию, поэтому setUrgent() необходим для получения предыдущего времени.
http://android-developers.blogspot.nl/2015/11/whats-new-in-google-play-services-83.html
Убедитесь, что applicationId в файле build.gradle одинаков для вашего портативного устройства и вашего носимого модуля
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'
}
...
1.Проверьте сборку build.gradle для мобильных устройств и на предмет износа, чтобы иметь одинаковую игровую версию. 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 для обоих без данных) (поэтому подготовьтесь к работе даже после удаления данных)
Моя проблема заключалась в том, что данные находились в очереди и приостанавливались на часах до первого касания - теперь это в режиме реального времени двунаправленный
Для меня виновником была эта строка в сервисной декларации:
android:permission="android.permission.BIND_NOTIFICATION_LISTENER_SERVICE"
Я не совсем уверен, что из-за этой строки служба не получает события, но когда она была удалена, она начала нормально работать.
Если вы используете эмулятор Android Wear, убедитесь, что приложение Android Wear на телефоне подключено к эмулятору, и вы запустите команду adb tcp forwarding.
Дополнительная информация здесь: /questions/20380735/sopryazhenie-emulyatorov-android-i-wear/20380739#20380739
После метода onDataChanged я заставляю
onDataChanged (DataEventBuffer dataEvents) {
--doDataStuff ---
mGoogleApiClient.disconnect (); mGoogleApiClient.connect ();
}
только с этой настройкой у меня работает onDataChanged.