Servicio enlazado de Android: ¿debo reconectar manualmente en onServiceDisconnected o intento reconectar automáticamente?

Si me desconecta del servicio enlazado debido a algunas circunstancias inesperadas, después de que llamé, ¿debo reconectar manualmente en onServiceDisconnected o intento de reconectar automáticamente?

public class MyServiceConnection extends Activity implements ServiceConnection { MyBinder binder; @Override protected void onStart() { super.onStart(); connect(); } private void connect() { bindService(new Intent(this, MyService.class), this, Service.BIND_AUTO_CREATE); } @Override public void onServiceConnected(ComponentName name, IBinder service) { binder = (MyBinder) service; } @Override public void onServiceDisconnected(ComponentName name) { binder = null; //should i reconnect here ? connect(); } } 

2 Solutions collect form web for “Servicio enlazado de Android: ¿debo reconectar manualmente en onServiceDisconnected o intento reconectar automáticamente?”

De acuerdo con la API de ServiceConnection :

Public abstract void onServiceDisconnected (Nombre de ComponentName)

Se llama cuando se ha perdido una conexión con el servicio. Esto suele suceder cuando el proceso que aloja el servicio se ha estrellado o ha sido asesinado. Esto no quita la ServiceConnection misma – esta vinculación al servicio permanecerá activa, y recibirá una llamada a onServiceConnected (ComponentName, IBinder) cuando el servicio se ejecuta a continuación.

Volver a su pregunta:

 @Override public void onServiceDisconnected(ComponentName name) { binder = null; //should i reconnect here ? connect(); } 

Todo depende de qué proceso viva el servicio real.

Servicio local:

El servicio se ejecuta en el mismo proceso que otros componentes (es decir, la actividad que se vincula a él) de la misma aplicación, cuando este único proceso de ámbito de aplicación se ha estrellado o ha sido asesinado, es muy probable que todos los componentes de este proceso Que están vinculados a este servicio) también son destruidos. En este caso, llamar a connect () dentro de onServiceDisconnected () no produce ningún efecto, ya que cuando se recupera el proceso de la aplicación, todo se desplaza desde el principio y la actividad se vuelve a crear y el servicio está enlazado en la devolución de llamada onStart ().

Servicio remoto:

El servicio se ejecuta en un proceso separado, cuando este proceso se ha estrellado o se ha matado, sólo el servicio real se destruye, la actividad vive en otro proceso que vinculado al servicio se queda, por lo que probablemente está bien llamar a connect () en su onServiceDisconnected () Para volver a crear / volver a enlazar el servicio.

Consulta aquí para ver cómo configurar el servicio que se ejecuta en un proceso independiente en AndroidManifest.xml.

Bumped en esta vieja pregunta al hacer una investigación para un poste del blog. La respuesta aceptada es bastante buena, pero no muestra toda la imagen cuando se trata de servicios IPC (remotos).

Diagrama de estado de una conexión a servicio IPC vinculado se ve así:

Introduzca aquí la descripción de la imagen

Y la respuesta a la pregunta del OP es: depende.

En primer lugar – cuando el servicio se bloquea o muere por el sistema operativo que sigue vinculado . Así que la pregunta es si el sistema va a volver a crear el servicio o no …

  • En caso de que el servicio IPC está siendo destruido por el sistema operativo, se volverá a crear y obtendrá una llamada a onServiceConnected() , por lo tanto, no es necesario "volver a conectar".
  • En caso de que el servicio IPC se bloquee, el sistema intentará volver a crearlo una vez. Si se bloquea por segunda vez, el sistema no lo volverá a crear (probado en JellyBean, Lollipop y Marshmallow).

Teóricamente, podría unbindService() y luego bindService() en cada llamada a onServiceDisconnected() – esto debería funcionar (creo).

Sin embargo, escribir un cliente realmente confiable para el servicio IPC unido es un poco más de trabajo, y la idea general (junto con la aplicación tutorial) podría encontrarse aquí .

  • ¿Comprobar si el servicio se está ejecutando en Android?
  • ¿Puedo llamar a stopSelf () en Service.onStartCommand?
  • ¿Cómo utilizar PendingIntent para comunicarse desde un servicio a un cliente / actividad?
  • Android - Servicio de fondo de juego de Tamagotchi
  • Obtener Excepción al mostrar el cuadro de diálogo de alerta de servicio - No se puede agregar ventana - el símbolo nulo no es para una aplicación
  • Creación de servicio sin consolidar en Kotlin
  • Prueba de unidad Actividad.startService () llamada?
  • Por favor, explique algunos conceptos de servicio de Android
  • ¿Cómo puedo saber si mi servicio ha iniciado
  • Subir varias imágenes al servidor en una cola
  • Ejecutar un servicio con privilegios de root o agregar permisos con root
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.