Android Service-Activity 2方式通讯

pep*_*ght 5 java service android handler messenger

在我团队的Android应用程序中,我有一个从启动运行的服务,该服务与服务器通信以执行诸如登录,注册,手机之间聊天以及更新手机数据库之类的操作。

我需要使我的服务与活动进行双向通信:例如,我目前正在进行登录活动,并且用户名和密码是从应用程序屏幕上的文本字段获取的字符串,并且我已经能够通过它们服务,以向服务器发送授权命令。

public void loginPressed(View v){
    usernameStr = usernameField.getText().toString();
    passwordStr = passwordField.getText().toString();

    if (!bound) return;
    Bundle b = new Bundle();
    Message msg = Message.obtain(null, ChatService.LOGIN);
    try {
        b.putString("username", usernameStr);
        b.putString("password", passwordStr);
        msg.setData(b);
        messenger.send(msg);
    }
    catch (RemoteException e) {

    }
Run Code Online (Sandbox Code Playgroud)

正如我所期望的那样。当服务器以一条消息说明登录是否成功时,我需要它将消息传递回活动,以便如果成功则可以启动主活动,或者如果没有成功则提示重新输入。

我试图使用msg.replyTo字段来获取返回信息,以将信息发送回去,但是当我运行应用程序时,它强制关闭并带有空指针异常,我不知道为什么会这样。这是似乎是罪魁祸首的代码:

private class IncomingHandler extends Handler {
    @Override
    public void handleMessage(Message msg) {
        switch(msg.what) {
        case LOGIN:

            Bundle b = msg.getData();
            String username = b.getString("username");
            String password = b.getString("password");

            String loginMessage = TCPCall.login(username, password);
            connection.sendMessage(loginMessage);

            String loginReturn = connection.retrieveMessage();
            Message m;

            Scanner s = new Scanner(loginReturn);
            s.useDelimiter(",");
            String c = s.next();
            String status = s.next();
            String message = s.next();

            if (status.equals("OK")) {
                m = Message.obtain(null, LoginActivity.OK);
                try {
                    msg.replyTo.send(m);
                } catch (RemoteException e) {}
            }
            else {
                m = Message.obtain(null, LoginActivity.ERR);
                try {
                    msg.replyTo.send(m);
                } catch (RemoteException e) {}
            }
            break;
Run Code Online (Sandbox Code Playgroud)

空指针似乎来自

msg.replyTo.send(m);
Run Code Online (Sandbox Code Playgroud)

两种情况下的代码行(成功登录和登录失败)

任何帮助解决此问题的帮助将不胜感激:)

Pat*_*oos 1

正如格雷格在评论中指出的那样。您需要设置msg.replyTo = messenger;发送原始消息的位置。

可以在此处找到示例:http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html