我正在制作一个磨损应用程序,它可以在app主屏幕的启动时从数据库(手持设备上)获取数据。 因此,当主页活动启动时,它会使用Wearable.MessageApi.sendMessage函数从android wear到掌上电脑发送消息。在掌上电脑中,我有WearableListenerService,它在onMessageReceived函数中接收此消息并读取数据库。在读取数据库之后,它会将putDatamapRequest发送到磨损。
现在在磨损方面,我有另一个WearableListenerService。在此服务中,永远不会调用onDataChanged()函数。它有时运行,到目前为止它运行了2-3次但是它没有运行。它非常随机。此外,一旦在Wear侧收到数据,我设置了一个静态Arraylist,我用它来显示Activity中的数据。但由于并不总是调用onDataChanged函数,因此它给出了空数组列表。
这是我的AndroidManifest文件的磨损应用,我宣布了这项服务:
<service
android:name="com.example.deals.DataListenerService"
android:enabled="true"
android:exported="true" >
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
以下是我将代码从磨损发送到掌上电脑的代码:
mGoogleApiClient = new GoogleApiClient.Builder(this).addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() {
@Override
public void onConnected(Bundle bundle) {
Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).setResultCallback(new ResultCallback<NodeApi.GetConnectedNodesResult>() {
@Override
public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) {
if(!getConnectedNodesResult.getNodes().isEmpty())
{
node = getConnectedNodesResult.getNodes().get(0);
System.out.println("Connected: "+ node.getId());
Wearable.MessageApi.sendMessage(mGoogleApiClient, node.getId(), FETCH_ALL_DEALS, null).setResultCallback(new ResultCallback<MessageApi.SendMessageResult>() {
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult) {
if (!sendMessageResult.getStatus().isSuccess()) {
Log.e("Wear:", "ERROR: failed to send Message: " + sendMessageResult.getStatus());
}
else
System.out.println("success");
}
});
}
else
System.out.println("Wear not connected to Phone");
}
});
}
@Override
public void onConnectionSuspended(int i) {
}
})
.addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(ConnectionResult result) {
Log.v("Phone to wear connection failed", "onConnectionFailed: " + result);
}
})
.addApi(Wearable.API)
.build();
mGoogleApiClient.connect();
以下是我在Handheld上的onMessageReceive代码:
public void onMessageReceived(MessageEvent messageEvent) {
System.out.println("Message Received on Phone on launch of wear homepage");
if(messageEvent.getPath().equals(FETCH_ALL_DEALS)) {
sendSavedDeals(); //fetch from db and make a datamap object using PutDataRequest
System.out.println("Message Received on Phone on launch of wear homepage");
}
else {
System.out.println("Unable to recognise action for "+messageEvent.getPath());
}
}
现在,在我的穿着方面,我有一个WearableListenerService,但它的onDataChanged方法永远不会被调用。你可以帮我解决这个问题。
答案 0 :(得分:13)
onDataChanged()
仅在数据确实更改时调用。如果将相同的数据多次放入DataApi,则该方法仅被称为一次,直到您编写不同的数据。
要在磨损方面触发操作,即使数据没有改变,也要在将数据放入DataApi后发送消息。
答案 1 :(得分:1)
应更改或删除数据,以便在您的服装中的 WearabaleListenerService 中回复 onDataChanged 。 如果你想进行更改,请从设置中打开APP-info,然后在强制停止后打开清除数据。 最后在手机中启动你的应用程序..但确保你的服装中已经开始穿戴可穿戴服务......
答案 2 :(得分:0)
未调用onDataChanged()
时:
首先,确保手持活动在开始时连接到API:
@Override protected void onStart() { super.onStart(); mGoogleApiClient.connect(); }
否则,它会无声地失败。
如果它仍然不起作用,为了便于调试,在掌上电脑活动中添加此覆盖方法和此类以每5秒生成一次数据:
@Override public void onResume() { super.onResume(); mDataItemGeneratorFuture = mGeneratorExecutor.scheduleWithFixedDelay( new DataItemGenerator(), 1, 5, TimeUnit.SECONDS ); }
/** Generates a DataItem based on an incrementing count. */ private class DataItemGenerator implements Runnable { private int count = 0; @Override public void run() { PutDataMapRequest putDataMapRequest = PutDataMapRequest.create(COUNT_PATH); putDataMapRequest.getDataMap().putInt(COUNT_KEY, count++); PutDataRequest request = putDataMapRequest.asPutDataRequest(); Log.d("yourApp", "Generating DataItem: " + request); if (!mGoogleApiClient.isConnected()) { return; } Wearable.DataApi.putDataItem(mGoogleApiClient, request) .setResultCallback(new ResultCallback() { @Override public void onResult(DataItemResult dataItemResult) { if (!dataItemResult.getStatus().isSuccess()) { Log.e("YourApp", "ERROR: failed to putDataItem, status code: " + dataItemResult.getStatus().getStatusCode()); } } }); } }