Android Wear:发送给Wearable的数据项也通过本地绑定接收-如何防止这种情况?
我有一个关于Android Wear的问题:Android Wear:发送给Wearable的数据项也通过本地绑定接收-如何防止这种情况?,android,Android,我有一个关于Android Wear的问题:Wearable.DataApi.putDataItem: 我的应用程序通过以下方式将一些数据从手机发送到wear: dataToWearRequest = PutDataRequest.create("/image"); dataToWearRequest.setData(compressedPictureAsByteArray); Wearable.DataApi.putDataItem(mGoogleApiClient, dataToWearRe
Wearable.DataApi.putDataItem
:
我的应用程序通过以下方式将一些数据从手机发送到wear:
dataToWearRequest = PutDataRequest.create("/image");
dataToWearRequest.setData(compressedPictureAsByteArray);
Wearable.DataApi.putDataItem(mGoogleApiClient, dataToWearRequest);
磨损是通过使用实现DataApi.DataListener
的活动正确接收数据:
public void onDataChanged(DataEventBuffer dataEvents) {
for (DataEvent event : dataEvents) {
if (event.getType() == DataEvent.TYPE_CHANGED &&
event.getDataItem().getUri().getPath().equals("/image")) {
DataItem dataItem = event.getDataItem();
byte content[] = dataItem.getData();
if (mDebug) System.out.println("onDataChanged: receiver: content.length="+ content.length);
}
}
}
但我的移动应用程序还有一个可穿戴ListenerService
,需要它来接收来自wear的消息。WearableListenerService
类本身也实现了DataApi.DataListener
(如我所说:在移动设备上)。在该服务中,onDataChanged
方法还接收发送到服务器的数据包。它的实现非常简单(在我的例子中,因为我不需要来自服务器的数据包):
此移动服务的相应清单条目看起来与往常一样:
<service android:name=".RemoteControlWearService">
<intent-filter>
<action android:name="com.google.android.gms.wearable.BIND_LISTENER" />
</intent-filter>
</service>
我试图在移动设备的清单文件中设置一个带有未知路径的意图过滤器,以防止它接收/image数据。但这没有帮助
我问这个问题是因为手机确实复制了发送到wear的数据包,以便能够呼叫onDataReceived
。在可穿戴.DataApi.putDataItem的内部,似乎存在内存泄漏:当您向wear发送许多图像时,移动设备的内存消耗正在增加,并且从不进行垃圾收集(即本机缓冲区)。我想通过防止向本地服务发送不需要的包裹来减少移动应用程序的内存消耗
有人知道我如何阻止我的本地移动服务只接收指向wear的数据包吗?您可以检索本地节点id,然后通过调用
dataItem.getUri().getHost()
将其与触发DataEvent的id进行比较。最好的比较方法是对dataItem.getUri().getHost()
返回的值调用equals()
,并将localNodeId作为参数
您可以在下面看到我的实现:
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
String localNodeId = NodeUtils.getLocalNodeId(this);
for (DataEvent dataEvent : dataEvents) {
if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
DataItem dataItem = dataEvent.getDataItem();
String host = dataItem.getUri().getHost();
if (host.equals(localNodeId)) continue; // Ignore local changes
if (dataItem.getUri().getPath().equals(THE_DATA_PATH_I_WANT)) {
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
// Do something with my DataMap
}
}
}
}
使用用于获取节点id的代码
public class NodeUtils {
@Nullable
public static String getLocalNodeId(@NonNull Context context) {
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.build();
ConnectionResult connectionResult = googleApiClient.blockingConnect(30, TimeUnit.SECONDS);
return connectionResult.isSuccess() ? getLocalNodeId(googleApiClient) : null;
}
@Nullable
public static String getLocalNodeId(@NonNull GoogleApiClient googleApiClient) {
NodeApi.GetLocalNodeResult nodeResult =
Wearable.NodeApi.getLocalNode(googleApiClient).await(10, TimeUnit.SECONDS);
if (nodeResult.getStatus().isSuccess()) {
return nodeResult.getNode().getId();
} else {
Timber.wtf("couldn't get local node? status: %s", nodeResult.getStatus());
return null;
}
}
}您可以检索本地节点id,然后通过调用dataItem.getUri().getHost()
将其与触发DataEvent
的节点id进行比较。最好的比较方法是对dataItem.getUri().getHost()
返回的值调用equals()
,并将localNodeId作为参数
您可以在下面看到我的实现:
@Override
public void onDataChanged(DataEventBuffer dataEvents) {
String localNodeId = NodeUtils.getLocalNodeId(this);
for (DataEvent dataEvent : dataEvents) {
if (dataEvent.getType() == DataEvent.TYPE_CHANGED) {
DataItem dataItem = dataEvent.getDataItem();
String host = dataItem.getUri().getHost();
if (host.equals(localNodeId)) continue; // Ignore local changes
if (dataItem.getUri().getPath().equals(THE_DATA_PATH_I_WANT)) {
DataMap dataMap = DataMapItem.fromDataItem(dataItem).getDataMap();
// Do something with my DataMap
}
}
}
}
使用用于获取节点id的代码
public class NodeUtils {
@Nullable
public static String getLocalNodeId(@NonNull Context context) {
GoogleApiClient googleApiClient = new GoogleApiClient.Builder(context)
.addApi(Wearable.API)
.build();
ConnectionResult connectionResult = googleApiClient.blockingConnect(30, TimeUnit.SECONDS);
return connectionResult.isSuccess() ? getLocalNodeId(googleApiClient) : null;
}
@Nullable
public static String getLocalNodeId(@NonNull GoogleApiClient googleApiClient) {
NodeApi.GetLocalNodeResult nodeResult =
Wearable.NodeApi.getLocalNode(googleApiClient).await(10, TimeUnit.SECONDS);
if (nodeResult.getStatus().isSuccess()) {
return nodeResult.getNode().getId();
} else {
Timber.wtf("couldn't get local node? status: %s", nodeResult.getStatus());
return null;
}
}
}