onMessageReceived 仅在 Service 中调用但未在 Activity 中调用
onMessageReceived only called in Service but not in Activity
onMessageReceived只在WearabeListenerService中调用。
如果我不使用服务而只是将我的 Activity 注册为 MessageApi 侦听器
onMessageReceived 未被调用。
我按如下方式注册监听器:
if (!mConnection.isConnected()) {
phoneConnectionError();
} else {
Wearable.MessageApi.addListener(mConnection, this).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
Log.d("Viera","Add listener success: "+status.isSuccess());
}
});
}
状态总是成功。
我做错了什么?
编辑:根据要求,这里有更多 Activity 代码:
Edit2:添加了更多代码
public class MainActivity extends WearableActivity
implements ResultCallback<MessageApi.SendMessageResult>, MessageApi.MessageListener {
private BoxInsetLayout mContainerView;
private String nodeId;
private GoogleApiClient mConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mContainerView = (BoxInsetLayout) findViewById(R.id.container);
mConnection = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build();
setAmbientEnabled();
retrieveDeviceNode();
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
Log.d("Viera","Recieved: "+messageEvent.getPath());
if (messageEvent.getPath().equals("tvException")) {
tvException();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Wearable.MessageApi.removeListener(mConnection, this);
mConnection.disconnect();
}
private void afterNodeSearch() {
if (nodeId == null || !mConnection.isConnected()) {
phoneConnectionError();
} else {
Wearable.MessageApi.addListener(mConnection, this).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
Log.d("Viera","Add listener success: "+status.isSuccess());
}
});
//... some other stuff here
}
}
// I know I should to this useig an other API but I know I am connected to the right node
// because the Id's here and on mobile device matches
private void retrieveDeviceNode() {
findViewById(R.id.loading).setVisibility(View.VISIBLE);
findViewById(R.id.content).setVisibility(View.GONE);
new Thread(new Runnable() {
@Override
public void run() {
mConnection.blockingConnect();
NodeApi.GetConnectedNodesResult result =
Wearable.NodeApi.getConnectedNodes(mConnection).await();
List<Node> nodes = result.getNodes();
if (nodes.size() > 0) {
nodeId = nodes.get(0).getId();
}
afterNodeSearch();
}
}).start();
}
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult) {
if (!sendMessageResult.getStatus().isSuccess()) {
phoneConnectionError();
} else {
Log.d("Viera", "Send successfull!");
}
}
public void onClick(View v) {
if (nodeId == null) {
retrieveDeviceNode();
} else if (!mConnection.isConnected()) {
connect();
} else {
String command = v.getTag().toString();
sendCommand(COMMAND, command);
}
}
private final static String COMMAND = "onCommand", START_APP = "startApp";
private void sendCommand(final String command, final String msg) {
if (nodeId != null) {
new Thread(new Runnable() {
@Override
public void run() {
if (mConnection.isConnected()) {
byte[] msgBytes = null;
if (msg != null) msg.getBytes();
Wearable.MessageApi.sendMessage(mConnection, nodeId, command, msgBytes).setResultCallback(MainActivity.this);
} else {
phoneConnectionError();
}
}
}).start();
}
}
}
根据您提供的代码,您正在构建一个 GoogleApiClient(您称为 mConnection),但您从未连接过它(即从未调用过 mConnection.connect())。此外,在构建GoogleApiClient 时,您还需要定义两个监听器(可以是您的activity);一种用于接收成功的连接回调,一种用于接收失败。在成功连接的那个中,有一个 onConnected() 回调,您应该使用它来添加 MessageApi 侦听器等。如果您在我们的 GitHub 存储库中查看 Wear 的任何示例项目,您将看看所有这些是如何完成的。
好的,我终于找到了我的问题:
我用错了钥匙!可穿戴设备和移动应用程序的签名不同!
它发现当消息被发送时,我总是会在 WerableListenerService 中收到通知,即使签名不同但不在使用 Wearable.MessageApi.addListener.
注册的监听器中
这意味着我的代码是正确的,但我的建筑是错误的!
onMessageReceived只在WearabeListenerService中调用。 如果我不使用服务而只是将我的 Activity 注册为 MessageApi 侦听器 onMessageReceived 未被调用。 我按如下方式注册监听器:
if (!mConnection.isConnected()) {
phoneConnectionError();
} else {
Wearable.MessageApi.addListener(mConnection, this).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
Log.d("Viera","Add listener success: "+status.isSuccess());
}
});
}
状态总是成功。 我做错了什么?
编辑:根据要求,这里有更多 Activity 代码:
Edit2:添加了更多代码
public class MainActivity extends WearableActivity
implements ResultCallback<MessageApi.SendMessageResult>, MessageApi.MessageListener {
private BoxInsetLayout mContainerView;
private String nodeId;
private GoogleApiClient mConnection;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
setContentView(R.layout.activity_main);
mContainerView = (BoxInsetLayout) findViewById(R.id.container);
mConnection = new GoogleApiClient.Builder(this)
.addApi(Wearable.API)
.build();
setAmbientEnabled();
retrieveDeviceNode();
}
@Override
public void onMessageReceived(MessageEvent messageEvent) {
Log.d("Viera","Recieved: "+messageEvent.getPath());
if (messageEvent.getPath().equals("tvException")) {
tvException();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Wearable.MessageApi.removeListener(mConnection, this);
mConnection.disconnect();
}
private void afterNodeSearch() {
if (nodeId == null || !mConnection.isConnected()) {
phoneConnectionError();
} else {
Wearable.MessageApi.addListener(mConnection, this).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
Log.d("Viera","Add listener success: "+status.isSuccess());
}
});
//... some other stuff here
}
}
// I know I should to this useig an other API but I know I am connected to the right node
// because the Id's here and on mobile device matches
private void retrieveDeviceNode() {
findViewById(R.id.loading).setVisibility(View.VISIBLE);
findViewById(R.id.content).setVisibility(View.GONE);
new Thread(new Runnable() {
@Override
public void run() {
mConnection.blockingConnect();
NodeApi.GetConnectedNodesResult result =
Wearable.NodeApi.getConnectedNodes(mConnection).await();
List<Node> nodes = result.getNodes();
if (nodes.size() > 0) {
nodeId = nodes.get(0).getId();
}
afterNodeSearch();
}
}).start();
}
@Override
public void onResult(MessageApi.SendMessageResult sendMessageResult) {
if (!sendMessageResult.getStatus().isSuccess()) {
phoneConnectionError();
} else {
Log.d("Viera", "Send successfull!");
}
}
public void onClick(View v) {
if (nodeId == null) {
retrieveDeviceNode();
} else if (!mConnection.isConnected()) {
connect();
} else {
String command = v.getTag().toString();
sendCommand(COMMAND, command);
}
}
private final static String COMMAND = "onCommand", START_APP = "startApp";
private void sendCommand(final String command, final String msg) {
if (nodeId != null) {
new Thread(new Runnable() {
@Override
public void run() {
if (mConnection.isConnected()) {
byte[] msgBytes = null;
if (msg != null) msg.getBytes();
Wearable.MessageApi.sendMessage(mConnection, nodeId, command, msgBytes).setResultCallback(MainActivity.this);
} else {
phoneConnectionError();
}
}
}).start();
}
}
}
根据您提供的代码,您正在构建一个 GoogleApiClient(您称为 mConnection),但您从未连接过它(即从未调用过 mConnection.connect())。此外,在构建GoogleApiClient 时,您还需要定义两个监听器(可以是您的activity);一种用于接收成功的连接回调,一种用于接收失败。在成功连接的那个中,有一个 onConnected() 回调,您应该使用它来添加 MessageApi 侦听器等。如果您在我们的 GitHub 存储库中查看 Wear 的任何示例项目,您将看看所有这些是如何完成的。
好的,我终于找到了我的问题:
我用错了钥匙!可穿戴设备和移动应用程序的签名不同!
它发现当消息被发送时,我总是会在 WerableListenerService 中收到通知,即使签名不同但不在使用 Wearable.MessageApi.addListener.
注册的监听器中这意味着我的代码是正确的,但我的建筑是错误的!