Mejores prácticas de Android Socket.IO para mantener la conexión activa

Mi aplicación para Android utiliza la biblioteca AndroidAsync para conectarse a un servidor Node.js con el cliente Socket.IO . El cliente socket se establece a través de un servicio.

  • El socket necesita permanecer abierto / conectado cuando la aplicación está abierta
  • El socket se puede cerrar cuando la aplicación no está abierta
  • Hay una excepción en la que socket necesita permanecer abierta mientras la aplicación no está abierta

Actualmente estoy iniciando el servicio Socket.IO en el onResume y me onPause en onPause de cada Activity en la aplicación.

Esto parece realmente ineficaz porque básicamente detengo el socket y recreo uno nuevo cada vez que presiono el botón de inicio, o cambiar a otra actividad en la aplicación.

¿Cuál sería la mejor manera de manejar los requisitos anteriores sobre cómo mantener abierto el zócalo?

 public class SocketIOService extends Service { private Preferences prefs; private SocketIOClient socket; @Override public int onStartCommand(Intent intent, int flags, int startId) { try { ConnectCallback callback = new ConnectCallback() { @Override public void onConnectCompleted(Exception ex, SocketIOClient client) { if (ex != null) { ex.printStackTrace(); return; } Log.v("SOCKET IO CONNECTION", "ESTABLISHED"); client.setDisconnectCallback(new DisconnectCallback() { @Override public void onDisconnect(Exception e) { Log.v("SOCKET IO CONNECTION", "TERMINATED"); } }); client.setErrorCallback(new ErrorCallback() { @Override public void onError(String error) { Log.e("SOCKET IO ERROR", error); } }); client.setExceptionCallback(new ExceptionCallback() { @Override public void onException(Exception e) { e.printStackTrace(); } }); client.setReconnectCallback(new ReconnectCallback() { @Override public void onReconnect() { Log.v("SOCKET IO CONNECTION", "RECONNECTED"); } }); client.on(EVENT_NEWS, new EventCallback() { @Override public void onEvent(JSONArray argument, Acknowledge acknowledge) { Log.v("EVENT:NEWS", argument.toString()); } }); client.on(EVENT_MESSAGE_RECEIVE, new EventCallback() { @Override public void onEvent(JSONArray argument, Acknowledge acknowledge) { handleMessageReceive(argument); } }); } }; socket = SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), URL_SERVER, callback).get(); JSONArray array = new JSONArray(); JSONObject obj = new JSONObject(); prefs = new Preferences(this); try { obj.put(KEY_USER_ID, prefs.getUserId()); } catch (JSONException e) { e.printStackTrace(); } array.put(obj); socket.emit(EVENT_LOG_USER_ID, array); Log.v("SOCKET LOG USER ID", array.toString()); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } // If we get killed, after returning from here, restart return START_REDELIVER_INTENT; } @Override public void onDestroy() { Log.v("SOCKET IO SERVICE", "STOPPED"); if (socket != null) { if (socket.isConnected()) { socket.disconnect(); } } } @Override public IBinder onBind(Intent intent) { return null; } private void handleMessageReceive(JSONArray json) { ChatMessage message = JReader.createMessage(json); } } 

Tengo una solución parcial (no va a resolver su tercer requisito, creo). Comencé a escribir un juego multi-jugador simple apenas para studing la programación del juego. Decidí utilizar TCP conntection (por qué? Es otro problema …), y tuve que mantener la conexión abierta mientras el usuario procedía en cada Acitivty (login -> lobby -> elegir el oponente …), he usado un Singleton (Comprobación de doble bloqueo), que contiene el enchufe de conexión.

Pseudo código

 class ClientConnection{ private static ClientConnection conn = null; Socket mSocket; // your socket protected ClientConnection(){ mSocket = new Socket(); // mSocket.connect( bla bla bla ) } public Socket getSocket(){ return mSocket(); } public static ClientConnection getInstance(){ if(conn == null){ synchronized (LOCK) { if(conn == null){ conn = new ClientConnection(); } } } return conn; } } 
  • Conectando clientes de escritorio y móviles a Django y Sails MVC webframeworks
  • Mostrar java.util.logging.Logger registra en Android Studio logcat
  • Descartar error de transporte al utilizar Nodejs + SocketIO
  • Emitir mensajes socket.io en Android
  • La mejor manera de implementar Socket.io en android
  • Cliente Socket.io android java que recibe mensajes y envía ejemplo de archivo
  • Android navegador y socket io
  • Android: usando el cliente java socket.io de Gottox en la aplicación android
  • Conexión a un espacio de nombres socket.io mediante la biblioteca socket.io-client.java
  • Conectar cliente android a sails.js
  • Aplicación de chat utilizando socket.io
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.