Android: Pasar un servicio a un manejador
Por lo tanto, he leído la documentación de AIDL de Android y tengo una idea general de cómo funciona RPC entre una actividad y un servicio. Sin embargo, para mi aplicación parece al margen para implementar tales características: básicamente, quiero pasar un servicio de un controlador agradable para que su hilo puede pasar los datos a mi actividad. Actualmente estoy consiguiendo alrededor de esto usando un miembro público estático (un hack) pero preferiría apenas pasar un objeto del manipulador en el intento inicial del servicio. Por ejemplo, puedo pasar fácilmente a mi servicio durante la creación:
int x = 0; Intent svc = new Intent(this, MyService.class); svc.putExtra("x",x); startService(svc);
Sin embargo, desde un Handler no es serializar-capaz, no he encontrado una manera de pasar al servicio sin un simple miembro estático hack. ¿Alguna idea? ¿O, voy a tener que chuparlo y hacer un RPC formal al servicio?
- Problema con MulticastSocket en Java-Android
- Keytool genera huella digital SHA1 en lugar de MD5?
- Youtube API v3 buscar videos, recuperar el título y url
- En Java, ¿cómo verifica si una variable float es null?
- Prueba de unidad Android: ¿Cómo hacer que una clase sea más comprobable?
- BindException con el permiso de INTERNET solicitado
- En Java, ¿qué hace una referencia a Class.class?
- ¿Cómo agregar timePicker usando fragmento?
- ¿Cómo cambiar el fondo del widget usando RemoteViews?
- Android fill singlechoiceitems diálogo con los valores arraylist
- Establecer credenciales en una vista Web de Android mediante una conexión HTTPS segura
- EventBus - El método anotado @Subscribe nunca se utiliza
- La orientación de la vista previa en el modo horizontal se gira en el sentido de las agujas del reloj con Camera2 api
Si su Servicio y Actividad están en el mismo proceso, puede pasar un Carpeta desde su Servicio sin hacer las cosas RPC complicadas:
public class MyEasyButNotGoodPracticesBinder { public void gimmeHandler(Handler handler) { // you got it! } } IBinder mBinder = new MyEasyButNotGoodPracticesBinder(); public IBinder onBind(Intent intent) { return mBinder; }
A continuación, en su Actividad cuando obtenga el objeto IBinder, simplemente MyEasyButNotGoodPracticesBinder
a MyEasyButNotGoodPracticesBinder
y llame al gimmeHandler(Handler)
. Ahora, creo que esto es malas prácticas porque si alguna vez quieres poner tu Servicio en un proceso separado para que no se bloquee todo el proceso si se bloquea, esto se rompería. Yo tampoco creo que sea una prueba de futuro. Pero funciona.
Una interfaz AIDL no es tan difícil – es posible que desee hacerlo en su lugar.
La documentación de Android sugiere trabajar con un mensajero como interfaz de cliente en su servicio de mensajería remota Ejemplo: Ejemplo de servicio de mensajería remota
Ejemplo de código se puede encontrar en el enlace anterior, sin necesidad de repost aquí, supongo …
Saludos, Michael