2011-11-06 25 views
7

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 ServiceS se inicia desde ApplicationA.

ActivityB (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:
    1. Inicie la aplicación A (y también inicie el servicio S).
    2. Comience la actividad B, todo funciona bien.
    3. Reinicie el servicio volviendo a implementar la aplicación A.
    4. Navegue a la actividad B. La excepción ocurre.
    5. 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 al finish() en onReceive()). El problema es que si la actividad se detiene, no se le entregan Intent s. Además, veo que onDestroy() 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 un BaseActivity como se menciona en this stackoverflow question.
  • También intenté configurar FLAG_ACTIVITY_CLEAR_TASK (además del habitual FLAG_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?

Respuesta

2

En la actividad B, implemente una interfaz IBinder.DeathRecipient (posiblemente incluida en una clase personalizada) y regístrela con el IBinder de su servicio a través del IBinder.linkToDeath().Su devolución de llamada se activará cuando/si el Service fallece por algún motivo y la Actividad B puede limpiar con gracia cualquier libro interno que tenga, así como volver a unirse al servicio.

Cuestiones relacionadas