¿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.
- OnDraw eficiente con mapas de bits y aceleración por hardware
- Android proguard obfuscated código está causando NullPointerException cuando realmente no debe ser
- 'While' no puede completar sin lanzar una excepción - Android
- ¿Qué tipo de formatos de imagen debo utilizar en una aplicación de Android?
- Calcular Pi en un teléfono Android
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:
- Inicie la aplicación A (también iniciar el servicio S).
- Comience la actividad B, todo funciona bien.
- Reinicie el servicio reubicando la aplicación A.
- Vaya a la actividad B. La excepción ocurre .
- 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 afinish()
enonReceive()
). El problema es que si la actividad se detiene, no se le entreganIntent
. También, veoonDestroy()
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 unaBaseActivity
como se menciona en esta pregunta stackoverflow. - También intenté establecer
FLAG_ACTIVITY_CLEAR_TASK
(además deFLAG_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?
- Captura de doble taps en Android
- Convertir de String a BigDecimal para hacer matemáticas en moneda
- Android MotionEvent Puntero Indice Confusión
- Falta el menú "Annotation processing" en eclipse
- Nombres de los parámetros del método build-preserve de Gradle release
- División de la cadena usando el método split
- Configuración de una clave personalizada al empujar nuevos datos a la base de datos de firebase
- Android AutoCompleteTextView con chips
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.
- Desactivar las notificaciones de una aplicación mediante programación en Android
- Abrir la actividad del navegador, pero evitar que esté en el historial de actividades