¿Cómo tratar con DeadObjectException en el servicio fallecido?

Estoy recibiendo DeadObjectException en mi código. A continuación, describo mi configuración y lo que he intentado solucionar el problema.


Se inicia un Service S desde la Application A.

Activity B (desde otra aplicación) se comunica con ese servicio mediante las interfaces Messenger e IBinder . Esta actividad también se inicia desde el mismo servicio. En un botón de prensa dentro de esta actividad, se supone que debo enviar un mensaje de vuelta al servicio. Con frecuencia obtengo DeadObjectException al pulsar el botón.

Entiendo que la causa más probable de esto es – el sistema ha matado y reiniciado el servicio, y la actividad tiene referencia antigua a él. Más allá de esto, no he encontrado mucha información en línea.

Esto es lo que he intentado:

  • Utilicé un startForeground() en servicio, y pude ver que el servicio se estaba ejecutando (notificación en el área de notificación) de forma continua. Todavía tengo la excepción.
  • En un reinicio del sistema, no recibo esta excepción por un tiempo.
  • La excepción es intermitente. No tengo un 100% repro. Sin embargo, en el escenario siguiente, siempre obtengo la excepción:
    1. Inicie la aplicación A (también iniciar el servicio S).
    2. Comience la actividad B, todo funciona bien.
    3. Reinicie el servicio reubicando la aplicación A.
    4. Vaya a la actividad B. La excepción ocurre .
    5. En este punto, si vuelvo a iniciar la actividad B, desaparecerá la excepción.
  • Esto me llevó a concluir que si me aseguraba que la actividad B es fresca cada vez que se inicia el servicio, esta excepción desaparecería. Entonces traté de entregar una intención asesina a la actividad B, antes de iniciarla. (Activity tiene un BroadcastReceiver , y llama a finish() en onReceive() ). El problema es que si la actividad se detiene, no se le entregan Intent . También, veo onDestroy() siendo golpeado en una cáscara de nuez, porque androides maneja el ciclo de vida de la actividad, intentos no se garantiza para ser entregado a él. También intenté extender una BaseActivity como se menciona en esta pregunta stackoverflow.
  • También intenté establecer FLAG_ACTIVITY_CLEAR_TASK (además de FLAG_ACTIVITY_NEW_TASK habitual), sin mejores resultados.

Ahora, me siento como si fuera de opciones. ¿Alguien se ha enfrentado a problemas similares? ¿Hay algo que pueda probar? ¿Es posible capturar la excepción y volver a enlazar el servicio?

En la Actividad B, implemente una interfaz IBinder.DeathRecipient (posiblemente envuelta en una clase personalizada) y regístrela con el IBinder desde su servicio a través de IBinder.linkToDeath() . Su devolución de llamada se verá afectada cuando / si el Service muere por algún motivo y la Actividad B puede limpiar graciosamente cualquier libro interno que lo mantenga, así como volver a enlazarlo al servicio.

  • ¿Cómo almacena una colección de cadenas en SQLite en Android?
  • ANDROID: ¿Cómo obtener acceso root en una aplicación de Android?
  • (Retrofit) No se pudo localizar el convertidor para la aplicación de bloqueo de clase
  • Android, setVisibility / tema de animación
  • Vinculación de datos de Android mediante etiqueta de inclusión
  • El evento de GreenRobot no puede ver anotaciones, "ningún método público"
  • Mejor implementación de Rotate3dAnimation en Android ViewFlipper
  • Iniciar intención "silenciosamente"
  • Red inalámbrica Wi-Fi de Android
  • Mediaplayer responde al segundo clic para pausar
  • AUDIOFOCUS_LOSS llamó después de una llamada telefónica en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.