Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android服务活动双向通信_Java_Android_Service_Handler_Messenger - Fatal编程技术网

Java Android服务活动双向通信

Java Android服务活动双向通信,java,android,service,handler,messenger,Java,Android,Service,Handler,Messenger,在我团队的Android应用程序中,我有一个从引导运行的服务,该服务与服务器通信,以执行诸如登录、注册、电话间聊天和更新电话数据库等操作 我需要使我的服务与活动双向通信:例如,我目前正在处理登录活动,用户名和密码是从应用程序屏幕上的文本字段中提取的字符串,我已经能够将它们传递给服务,以便它向服务器发送授权命令 public void loginPressed(View v){ usernameStr = usernameField.getText().toString(); pa

在我团队的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) {

    }
这是我所期望的。当服务器响应一条消息,说明登录是否成功时,我需要它将一条消息传递回活动,以便在成功时启动主活动,或者在不成功时提示重新输入

我试图使用msg.replyTo字段让返回的messenger返回信息,但当我运行应用程序时,它会强制关闭,并出现空指针异常,我不知道为什么会发生这种情况。以下代码似乎是罪魁祸首:

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;
空指针似乎来自

msg.replyTo.send(m);
登录成功和登录失败两种情况下的代码行


如果您能帮助解决此问题,我们将不胜感激:

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

可以在此处找到一个示例:

我认为您忘记了通过服务包发送对登录活动的响应。 所以,我对Messenger Service做了一些更改

定义一个全局变量并在传入处理程序中进行一些更改

static final int LOGIN_STATUS = 1;

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 = Message.obtain(null, LOGIN_STATUS);

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

        if (status.equals("OK")) {
            b.putString("responseC",c);
            b.putString("responseStatus",status);
            b.putString("responseMessage",message)

            m.setData(b);
            try {
                msg.replyTo.send(m);
            } catch (RemoteException e) {}
        }
        else {
           /*if something is wrong with username and password you can put 
           a toast*/

            }
        break;
现在,我们必须在我们的后勤活动和 在登录活动中也使用IncomingHandler

这个代码运行得很好,希望对您有所帮助, 谢谢


我不太熟悉replyTo字段。。。但是,邮件的replyTo成员似乎为空。您需要在发送原始邮件时分配它。例如,添加'msg.replyTo=messenger;'有人能回答格雷格的答案是否正确吗?代码似乎足够好了,而且它没有使用AIDL或其他复杂的东西……格雷格的答案是正确的。请看这里:
class IncomingHandler extends Handler{

        @Override
        public void handleMessage(Message msg) {
            switch (msg.what){
                case ChatService.LOGIN_STATUS:
                    String C = msg.getData().getString("responseC");
                    String Status = msg.getData().getString("responseStatus");
                    String Message = msg.getData().getString("responseMessage");

                    //Here is your response in LoginActivity, enjoy!!! 

                    break;

                default:
                    super.handleMessage(msg);
            }
        }
    }

final Messenger mMessenger = new Messenger(new IncomingHandler());

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_SATUS,0,0);
try {
    b.putString("username", usernameStr);
    b.putString("password", passwordStr);
    msg.setData(b);
    msg.replyTo = mMessenger;
    messenger.send(msg);
}
catch (RemoteException e) {
    // In this case the service has crashed before we could even
    // do anything with it; we can count on soon being
    // disconnected (and then reconnected if it can be restarted)
    // so there is no need to do anything here.

}