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; } } 
  • Eventos de apagado en Android
  • Android: mantener el servicio en ejecución cuando se mata la aplicación
  • El servicio de fondo de Android se está reiniciando cuando se cancela la aplicación
  • Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
  • Android: uso de la red en un servicio
  • Cómo detectar la visibilidad del selector de método de entrada sin el permiso de accesibilidad
  • Actualizar Android ListView en Widget
  • El servicio de Android solo se inicia en modo de depuración
  • Servicio de Android - URL de ping
  • ¿Cómo comprobar el permiso automático de MIUI mediante programación?
  • ¿Es posible utilizar la herencia en las interfaces AIDL?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.