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.

注册的监听器中

这意味着我的代码是正确的,但我的建筑是错误的!