Servicio Android-Comunicación de 2 vías
En la aplicación Android de mi equipo tengo un servicio que se ejecuta desde el arranque que se comunica con un servidor para realizar operaciones como iniciar sesión, registrarse, charlar entre teléfonos y actualizar la base de datos del teléfono.
Necesito hacer que mi servicio se comunique con la actividad de forma bidireccional: por ejemplo, estoy trabajando en la actividad de inicio de sesión en este momento y el nombre de usuario y contraseñas son cadenas tomadas de un campo de texto en la pantalla de la aplicación y he podido pasar Al servicio para que envíe un comando de autorización al servidor.
- Iniciar el servicio en el inicio y después de que se haya instalado la aplicación
- ¿Cómo evitar que el servicio se detenga cuando onTaskRemoved es calles?
- Cómo iniciar el servicio en android sin actividad
- El propósito del servicio debe ser explícito: Intención
- Cómo obtener respuesta del código USSD de 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) { }
Esto funciona como yo hubiera esperado. Cuando el servidor responde con un mensaje diciendo si el inicio de sesión fue o no satisfactorio, lo necesito para pasar un mensaje de nuevo a la actividad para que pueda iniciar la actividad principal si es exitoso o solicitar la reentrada si no.
Traté de utilizar el campo msg.replyTo para obtener el mensaje de vuelta para enviar la información de nuevo, pero cuando ejecuto la aplicación que la fuerza se cierra con una excepción de puntero nulo y no tengo ni idea de por qué esto está sucediendo. Aquí está el código que parece ser el culpable:
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;
El puntero nulo parece provenir de la
msg.replyTo.send(m);
Línea de código en ambos casos (inicio de sesión exitoso y inicio de sesión fallido)
Cualquier ayuda para solucionar este problema sería muy apreciada 🙂
- Comunicación de Android entre dos servicios
- La aplicación de Android que supervisa las llamadas entrantes mantiene el teléfono despierto
- Alternativa al método finish () para la clase de servicio? Matarlo muerto
- ¿Cómo puedo enlazar este servicio en Android?
- Android: Cómo enviar la solicitud http a través del servicio cada 10 segundos
- Transmisión recibida dos veces
- Servicio Android Jelly Bean que recibe todos los eventos de toque
- ¿Por qué no funciona mi servicio en Android? (Sólo quiero registrar algo nunca 5 segundos)
Como señala Gregg en los comentarios. Necesita establecer msg.replyTo = messenger;
En el lugar donde envía el mensaje original.
Un ejemplo puede encontrarse aquí: http://www.survivingwithandroid.com/2014/01/android-bound-service-ipc-with-messenger.html
- Controlador de eventos en android – diseñador de automatización y manejo de tiempo 2 vistas en manejadores separados
- Cambiar el tema en java no cambia el color de fondo