Servicios WebSocket de Android que realizan varias conexiones

He creado un servicio Web Socket. Pero manteniendo la conexión múltiple

Sólo quiero que la aplicación para hacer una conexión, a menos que la conexión de red cae y luego hacer otra. Pero ahora mismo, hace una conexión, si presiono el botón de inicio en el teléfono. Y volver a la aplicación, se hará otra conexión.

Gracias por su ayuda chicos .

OnCreate … de mi MainActivity

Intent startServiceIntent = new Intent(this, WebSocketServices.class); startService(startServiceIntent); 

Manifiesto

 <!-- WebSocket --> <receiver android:name="com.example.basicplayerapp.core.NetworkReceiver"> <intent-filter > <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> <service android:name="com.example.basicplayerapp.core.WebSocketServices"></service> 

NetworkReceiver

 public class NetworkReceiver extends BroadcastReceiver { public static final String TAG = HomeActivity.class.getSimpleName(); @Override public void onReceive(Context context, Intent intent) { ConnectivityManager conn = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = conn.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.getDetailedState() == NetworkInfo.DetailedState.CONNECTED) { Log.i(TAG, "connected"); Intent startServiceIntent = new Intent(context, WebSocketServices.class); context.startService(startServiceIntent); } else if(networkInfo != null){ NetworkInfo.DetailedState state = networkInfo.getDetailedState(); Log.i(TAG, state.name()); } else { Log.i(TAG, "lost connection"); } }//end onReceive };//end NetworkReceiver 

WebsocketServices

 public class WebSocketServices extends IntentService { public static final String TAG = WebSocketServices.class.getSimpleName(); private static String SOCKET_ADDR = "http://171.0.0.1:8080"; private String message = null; private WebSocket socket = null; public WebSocketServices() { super("DownloadService"); } @Override protected void onHandleIntent(Intent intent) { Log.i(TAG, "onHandleIntent"); //SOCKET_ADDR = intent.getStringExtra("ip"); if(socket==null || !socket.isOpen() || socket.isPaused()) connectToPASocket(SOCKET_ADDR); Log.d(TAG,"Service Invoke Function"); }//end onHandleIntent //===================================================================================== // Socket connection //===================================================================================== private void connectToPASocket(String SOCKET_ADDR) { Log.i(TAG, "connectToPASocket()"); // Checking if (socket != null && socket.isOpen()) return; // Initiate web socket connection AsyncHttpClient.getDefaultInstance().websocket(SOCKET_ADDR, null, new AsyncHttpClient.WebSocketConnectCallback() { @Override public void onCompleted(Exception ex, WebSocket webSocket) { Log.i(TAG, "onCompleted"); if (ex != null) { Log.i(TAG, "onCompleted > if (ex != null)"); ex.printStackTrace(); return; } socket = webSocket; socket.setStringCallback(new StringCallback() { public void onStringAvailable(String s) { Log.i(TAG, "socket.setStringCallback > onStringAvailable - s => " + s); System.out.println("I got a string: " + s); message = s; }// end onStringAvailable });// end socket.setStringCallback socket.setDataCallback(new DataCallback() { // Find out what this does @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { Log.i(TAG, "socket.setDataCallback > onDataAvailable | emitter=> " + emitter + " | bb => " + bb); System.out.println("I got some bytes!"); // note that this data has been read bb.recycle(); } });// end webSocket.setDataCallback }// end onCompleted });// end AsyncHttpClient.getDefaultInstance() }// end connectToPASocket }//end WebSocketServices 

MrT, tuve un problema similar.

No use intentionService. Simplemente utilice Servicio. Porque una vez que el intentService haya sido hecho, se acabará.

Después de cambiar a Servicio, lo que puede hacer, es utilizar boolean para comprobar si su servicio se ha iniciado así:

 boolean isSockeStarted = false; @Override public int onStartCommand(Intent intent, int flags, int startId) { ... if (socket == null || !socket.isOpen() || socket.isPaused()) { if (isSockeStarted) { //not started } else { isSockeStarted = true; } } .... 

Eso significa que este servicio sólo se iniciará una vez. Hasta que lo mate manualmente.

Funcionó para mí, trate de hacerme saber.

Intente filtrar las acciones en onReceive Method – algo como if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction()))

Sucedió porque después de su regreso a la aplicación onCreate será llamada por segunda vez y hacer otra conexión a socket. Por lo que puede simple no iniciar otro servicio si su IntentService sigue funcionando, algo así:

OnCreate … de MainActivity

 if(isMyServiceRunning(WebSocketServices.class)){ Intent startServiceIntent = new Intent(this, WebSocketServices.class); startService(startServiceIntent); } 

Para ver si su servicio se está ejecutando

 private boolean isMyServiceRunning(Class<?> serviceClass) { ActivityManager manager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceClass.getName().equals(service.service.getClassName())) { return true; } } return false; } 

Usted debe usar un servicio regular, no un servicio intencionado. Una vez terminado el servicio de intención, termina. Un servicio puede iniciar un subproceso de fondo que mantendrá la conexión de socket web hasta que lo mate explícitamente; O el sistema operativo recupera la memoria del servicio (en el que tendría que volver a iniciarlo).

  • Angularjs Phonegap Android usando Websockets
  • XMPP, WebSocket y otras preguntas
  • Web Sockets en el navegador Samsung Galaxy S3 Android?
  • Problemas con el certificado WSS y SSL en Android
  • Websocket Server Android
  • WebSockets para Android en la aplicación Phonegap con Node.js / Socket.IO server & client
  • ¿Alguien ha escrito una librería de Android para Pusher?
  • Biblioteca de Android para WSS (Secure Web Socket)
  • ¿Puedo conectarme con WebSocket en una aplicación de Android?
  • Enviar flujo de audio de Android (cliente) a C # (servidor) mediante Websocket
  • Aplicación de chat: qué tecnología es mejor para implementar aplicación de chat en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.