This question already has an answer here:
WearListenerService onDataChanged strange behavior
                                
                                    (1个答案)
                                
                        
                                4年前关闭。
            
                    
我现在在市场上已经有一个Android Wear应用大约10个月了,它已经停止工作了(不确定何时停止工作)。

我正在尝试使用在移动应用程序中记录的一些统计信息更新可穿戴式应用程序。正如我所说,这曾经可以正常且可靠地工作。我什至添加了时间戳,因此它是唯一的,因为onDataChanged仅在数据已更改时才调用。这保证了这一点。

我的问题

我可以通过调用PutDataMapRequest来提交Wearable.DataApi.putDataItem罚款,并且在我的ResultCallback中获得成功的回调。

通常在最后调用onDataChanged,但是延迟太多了,比过去更多了。而且,我知道它的设置正确,因为我有一个启动的应用程序,其中有一个Activity可以获取DataItems,并且那里存在积压。我在此onDataChanged中也遇到了与Activity相同的问题。

我做了什么


确保两个模块build.gradle文件中的versionCode和versionName匹配。
确保两个build.gradle文件都使用相同版本的支持和Google服务库。
确保两个类都连接到GoogleApiClient
确保每次数据都不同,以强制其在服务中调用onDataChanged。我不需要这个,只是使它起作用。


我的密码

移动

if (mGoogleApiClient.isConnected()) {
            PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(path);
            putDataMapRequest.getDataMap().putString("content", content);
            putDataMapRequest.getDataMap().putString("title", title);
            putDataMapRequest.getDataMap().putLong("timestamp", DateTime.now().getMillis());
            PutDataRequest request = putDataMapRequest.asPutDataRequest();

            Wearable.DataApi.putDataItem(mGoogleApiClient, request)
                    .setResultCallback(new ResultCallback<DataApi.DataItemResult>() {
                        @Override
                        public void onResult(DataApi.DataItemResult dataItemResult) {
                            if (!dataItemResult.getStatus().isSuccess()) {
                                Log.e("WearDevice", "buildWatchOnlyNotification(): Failed to set the data, "
                                        + "status: " + dataItemResult.getStatus().getStatusCode());
                            } else {
                                    Log.d(LOG_TAG, "Notificaiton result callback returned successfully: "+dataItemResult.getDataItem().toString());//: "+node.getDisplayName());
                            }
                        }
                    });
}


穿

我有一个扩展WearableListenerService的服务。像这样在清单中声明。

<service android:name=".NotificationUpdateService">
            <intent-filter>
                <action android:name="com.google.android.gms.wearable.BIND_LISTENER"/>
            </intent-filter>
        </service>


这是我的服务。

@Override
    public void onCreate() {
        super.onCreate();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .addApi(Wearable.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();

        mGoogleApiClient.connect();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDataChanged(DataEventBuffer dataEvents) {
        if (MainActivity.DEBUGGING)
            Log.d(LOG_TAG, "onDataChanged");
        for (DataEvent dataEvent : dataEvents) {

            if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
                DataMap dataMap = DataMapItem.fromDataItem(dataEvent.getDataItem()).getDataMap();
                String content = dataMap.getString("content");
                String title = dataMap.getString("title");
                if ("/mydatapath".equals(dataEvent.getDataItem().getUri().getPath())) {
                    buildWearableOnlyNotification(title, content, false);
                }
            }
        }
    }


buildWearableOnlyNotification方法创建并启动一个前台通知,并且在实际调用时可以正常工作。

最佳答案

现在,如果要立即同步数据,则需要设置urgent flag,否则框架将批处理这些调用并一次调用一次,这意味着您最多可以看到30分钟的延迟。这是对最新的Play服务所做的更改,以在真正不需要这种即时数据同步时保留电池。

10-08 17:15