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.
- La mejor manera de evitar los efectos del algoritmo Nagle usando webSockets?
- Tiempo de espera del cliente websocket android
- Comunicación de Android a node.js
- Biblioteca WebSocket para Android, iOS y Flash
- Método para enviar httpheaders desde android autobahn websocketconnection
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
- WebSocket HTML5 en el teléfono para Android
- ¿Alguien tiene éxito en la implementación de un servidor WebSocket para Android?
- Configurar un cliente Stomp en android con el marco de Spring en el lado del servidor
- Websocket en Android 4.4 con Phonegap
- ¿Qué biblioteca WebSocket utilizar en la aplicación para Android?
- Soporte de WebSocket en dispositivos móviles
- WebSocket en Android WebView
- Spring pedalea cliente web sockets para android
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).
- Java.lang.RuntimeException: setParameters falló en Camera Api
- Cómo incluir correctamente la biblioteca de soporte en aplicaciones no Eclipse de Android