Recibo DeadObjectException
en mi código. A continuación, describo mi configuración y lo que he intentado solucionar.¿Cómo lidiar con DeadObjectException en el servicio inactivo?
A Service
S se inicia desde Application
A.
Activity
B (desde otra aplicación) se comunica con dicho servicio utilizando Messenger
y IBinder
interfaces. Esta actividad también se inicia desde el mismo servicio. En un botón presione dentro de esta actividad, se supone que debo enviar un mensaje de vuelta al servicio. Con frecuencia consigo DeadObjectException
al presionar un botón.
Entiendo que la causa más probable de esto es: el sistema ha cancelado y reiniciado el servicio, y la actividad tiene una referencia anterior. Más allá de esto, no he encontrado mucha información en línea.
Esto es lo que he intentado:
- he usado un
startForeground()
en el servicio, y pude ver que el servicio estaba funcionando (notificación del á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 una reproducción 100%. Sin embargo, en la siguiente situación, siempre recibo la excepción:
- Inicie la aplicación A (y también inicie el servicio S).
- Comience la actividad B, todo funciona bien.
- Reinicie el servicio volviendo a implementar la aplicación A.
- Navegue a la actividad B. La excepción ocurre.
- En este punto, si reinicio la actividad B, la excepción desaparece.
- Esto me llevó a concluir que si me aseguraba de que la actividad B fuera reciente cada vez que se iniciara el servicio, esta excepción desaparecería. Luego traté de entregar un intento asesino a la actividad B, antes de comenzar. (La actividad tiene un
BroadcastReceiver
, y llama alfinish()
enonReceive()
). El problema es que si la actividad se detiene, no se le entreganIntent
s. Además, veo queonDestroy()
es golpeado en pocas palabras, porque Android administra el ciclo de vida de la actividad, no se garantiza que se le entreguen los intentos. También traté de extender unBaseActivity
como se menciona en this stackoverflow question. - También intenté configurar
FLAG_ACTIVITY_CLEAR_TASK
(además del habitualFLAG_ACTIVITY_NEW_TASK
), sin resultados mejores.
Ahora, me siento como si estoy fuera de opciones. ¿Alguien ha enfrentado problemas similares? ¿Hay algo que pueda probar? ¿Es posible atrapar la excepción y luego volver a vincular el servicio?