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; } } 
  • Android startService () tarda mucho tiempo en volver al subproceso de interfaz de usuario
  • ¿Es posible ejecutar mi servicio por tiempo indefinido?
  • Crear notificación cada día
  • GCM de Android SERVICE_NOT_AVAILABLE
  • Envío de una notificación desde un servicio en Android
  • Recolector de datos de sensor de fondo en Android
  • Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
  • Iniciar servicio desde la notificación
  • Android: mantener el servicio en ejecución cuando se mata la aplicación
  • Android - widget de actualización sobre el servicio con datos de la red. ¿El mejor enfoque?
  • Servicio de Android que no recibe Actualizaciones de ubicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.