Lanzar una excepción personalizada de un servicio a una actividad

Actualmente estoy trabajando en una aplicación XMPP 'en Android y estoy pensando en la mejor manera de lanzar un tipo diferente de Excepción que una RemoteException a mi actividad de mi servicio.

Como parece imposible lanzar otra cosa que una RemoteException usando IPC (no se puede declarar a tirar nada en su .aidl), sólo veo dos soluciones:

  • Crear un oyente para mi actividad para escuchar en mi excepción XMPP personalizado, que de hecho no se lanzará, sino que sólo se envía como un objeto habitual implementar el protocolo Parcelable.

  • Coge mi XMPPException y lanzar una RemoteException (con un contenido actualizado con mi XMPPException) – Pero en ese caso, ¿cómo podría saber en mi actividad si se trata de una XMPP o una RemoteException real? Marcando el nombre de la excepción y analizándolo en mi actividad? Sería realmente gore.

Tiene alguna idea ? ¿He extrañado algo de la documentación del SDK?

Gracias.

Si # 1 significa lo que creo que hace, usaría eso: haga que el servicio capture la excepción y llame a un método en un objeto de devolución de llamada definido por AIDL creado y suministrado por la actividad.

Puedes ver un ejemplo de esa técnica en este proyecto de cliente y servicio , de uno de mis libros.

Parece que podemos lanzar excepciones personalizadas derivadas de RemoteException. Así que puede tener XMPPRemoteException, o simplemente un MyRemoteException genérico que mantendrá la excepción original. A continuación se muestra una demostración para el segundo caso:

Servidor:

try { ... } catch(XMPPException e) { throw new MyRemoteException(e); } 

Cliente:

 try { service.someCall(); } catch(MyRemoteException e) { rethrow(e); } 

Método auxiliar:

 private void rethrow(MyRemoteException e) throws Exception { if(e.innerException instanceof XMPPException) throw (XMPPException)e.innerException; else throw e.innerException; } 

Excepción:

 public class MyRemoteException extends RemoteException { private static final long serialVersionUID = 1L; public Exception innerException; public MyRemoteException() {} public MyRemoteException(Exception innerException) { this.innerException = innerException; } } 
  • Cómo repetir la notificación diaria en el tiempo específico en androide a través del servicio de fondo
  • Depuración de fallos de servicio
  • NotificationManager.cancel () no funciona para mí
  • Servicio de ejecución en el fondo?
  • ¿Hay alguna manera de obtener actualizaciones de fondo de la API de Google Fit?
  • El servicio de Android solo se inicia en modo de depuración
  • El archivo AIDL no genera un archivo Java
  • Reconocimiento de voz como servicio de fondo
  • Android Development: Cambio del brillo de la pantalla en el servicio
  • Temporizador de cuenta atrás Android en segundo plano
  • Servicio de Android y tareas repetitivas que se ejecutan en subprocesos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.