Pasando objeto personalizado al servicio android en diferentes procesos

Tengo un servicio que se pone a comenzar en un proceso separado:

<service android:name=".services.UploadService" android:process=":UploadServiceProcess" /> 

Y puedo enlazarlo con éxito usando bindService (). Mi problema se produce cuando intento enviar un mensaje llamando a Messenger.send ():

 service.send(Message.obtain(null, UploadService.MESSAGE_UPLOAD_REQUEST, uploadRequest)); 

Donde uploadRequest es un objeto personalizado que implementa Parcelable

 Public class UploadRequest implementa Parcelable {
     Archivo de archivo público;
     Public boolean deleteOnUpload; 

 public UploadRequest(File file, boolean deleteOnUpload) { this.file = file; this.deleteOnUpload = deleteOnUpload; } private UploadRequest(Parcel in) { this.file = new File(in.readString()); } public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeString(this.file.getPath()); } public static final Parcelable.Creator<UploadRequest> CREATOR = new Parcelable.Creator<UploadRequest>() { public UploadRequest createFromParcel(Parcel in) { return new UploadRequest(in); } public UploadRequest[] newArray(int size) { return new UploadRequest[size]; } }; 

}

Establecer un punto de interrupción en mis servicios handleMessage, pero mi aplicación nunca llega al punto de interrupción. Sin embargo, si en lugar de usar mi objeto de UploadRequest personalizado me envía null, llego al punto de interrupción handleMessage como esperaba, pero obviamente no puedo hacer nada en ese momento. He verificado file.getPath () al llamar a writeToParcel devuelve una cadena no nula. Esto me lleva a creer que algo está apagado en mi clase UploadRequest, pero de google no puedo ver nada malo con mi clase. ¿Algunas ideas?

La documentación de Message member obj dice:

Objeto arbitrario para enviar al destinatario. Cuando se utiliza Messenger para enviar el mensaje a través de procesos esto sólo puede ser no nulo si contiene una Parcelable de una clase de framework (no una implementada por la aplicación). Para otra transferencia de datos use setData (Bundle). Tenga en cuenta que los objetos Parcelable aquí no se admiten antes del lanzamiento de FROYO.

Mi conjetura es usted está viendo un problema porque usted está creando su propio parcelable que no se permite al cruzar el límite del proceso. En su lugar, tendrá que empaquetar su objeto en un paquete. Esto también significa que su objeto necesitará implementar Serializable pero no necesitará ser Parcelable.

Lo intenté justo ahora.

Message.obj puede transferir una clase de marco, como ContentValues.

Y Message.SetData puede transferir un Bundle a través de procesos y puede colocar cualquier objeto Parcelable en el paquete.

Sólo recuerde llamar a setClassLoader en el paquete, cuando recibió el Messag.

Enviar lado

  Message localMsg = Message.obtain(); localMsg.what = TPServiceConnection.MSG_REPLY_SERVICE_HELLO; Bundle data = new Bundle(); ContentValues cv = new ContentValues(); cv.put("KEY", mRand.nextInt()); data.putParcelable("KEY", cv); TPServiceDataModal modal = new TPServiceDataModal(mRand.nextInt()); data.putParcelable("KEY2", modal); localMsg.setData(data); 

Lado de recepción

  Bundle data = msg.getData(); data.setClassLoader(this.getClass().getClassLoader()); Parcelable parcelable = data.getParcelable("KEY"); if (parcelable instanceof ContentValues) { ContentValues cv = (ContentValues) parcelable; Log.d(TAG, "reply content: " + cv.getAsInteger("KEY")); } Parcelable parcelable2 = data.getParcelable("KEY2"); if (parcelable2 instanceof TPServiceDataModal) { TPServiceDataModal modal = (TPServiceDataModal) parcelable2; Log.d(TAG, "reply modal: " + modal.mData); } 

Donde TPServiceDataModal es un calss Parcelable.

  • Notificación de IntentService - NullPointerException mientras obtiene Context
  • Android: Mejor manera de obtener datos del servidor (Widget + aplicación)
  • El servicio no se detiene incluso después de que el método onDestroy se llama en Android
  • No se puede solucionar la excepción MediaController.show ()
  • Android: Comprobar la conexión con el servidor
  • Android startActivity de la intención en el servicio
  • Espere con la operación hasta que se creen Vistas de fragmentos
  • Transmisión de audio mediante el servicio
  • Android O: Servicio no detenido por límites de ejecución de fondo
  • ¿Es mejor usar AsyncTask o Service para cargar un archivo en segundo plano?
  • Cómo iniciar el servicio desde fragmentos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.