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?

2 Solutions collect form web for “Pasando objeto personalizado al servicio android en diferentes procesos”

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.

  • ¿Cómo iniciar el servicio con Alarm Manager en Android?
  • Establecer un Listener en una clase basada en servicio
  • ¿Cómo funcionan las aplicaciones de Android, como Facebook, WhatsApp, en primer plano sin notificación?
  • ¿Cómo puedo saber si mi servicio ha iniciado
  • Relación de actividad y servicio de Android: después de Pausa, después de Parar
  • Continuar el servicio incluso si la aplicación se ha eliminado de la aplicación Reciente.
  • Notificación de primer plano en Android inicia nueva Actividad (vía pendingIntent) en lugar de una existente
  • Suscripción o vinculación a un servicio de Intent existente
  • Servicios de Android: START_STICKY no funciona en Kitkat
  • Obtener el color de píxel en segundo plano en Android
  • ¿Cómo mantener un servicio ejecutándose en segundo plano incluso después de que el usuario abandone la aplicación?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.