Acceso al controlador de subprocesos de interfaz de usuario desde un servicio

Estoy probando algo nuevo en Android para el que necesito acceder al manejador del hilo de la interfaz de usuario.

Yo sé lo siguiente:

  1. El subproceso de interfaz de usuario tiene su propio controlador y looper
  2. Cualquier mensaje se colocará en la cola de mensajes del subproceso de la interfaz de usuario
  3. El looper capta el evento y lo pasa al manejador
  4. El manejador maneja el mensaje y envía el evento specfic a la interfaz de usuario

Quiero tener mi servicio que tiene que conseguir el controlador de hilo de interfaz de usuario y poner un mensaje en este controlador. Para que este mensaje se procese y se emitirá a la interfaz de usuario. Aquí el servicio será un servicio normal que será iniciado por alguna aplicación.

Me gustaría saber si esto es posible. Si es así, por favor sugiera algunos fragmentos de código, para que pueda probarlo.

Saludos Girish

Este fragmento de código crea un controlador asociado con el subproceso principal (UI):

Handler handler = new Handler(Looper.getMainLooper()); 

A continuación, puede publicar elementos para su ejecución en el subproceso principal (UI) de la siguiente manera:

 handler.post(runnable_to_call_from_main_thread); 

Si el manejador se crea a partir del subproceso principal (UI), el argumento puede omitirse por brevedad:

 Handler handler = new Handler(); 

La Guía de desarrollo de Android en procesos e hilos tiene más información.

Cree un objeto Messenger conectado a su Handler y pase ese Messenger al Service (por ejemplo, en un Intent extra para startService() ). El Service puede enviar un Message al Handler través del Messenger . Aquí hay una aplicación de ejemplo que demuestra esto.

En este momento prefiero utilizar biblioteca de bus de eventos como Otto para este tipo de problema. Solo suscriba los componentes deseados (actividad):

 protected void onResume() { super.onResume(); bus.register(this); } 

A continuación, proporcione un método de devolución de llamada:

 public void onTimeLeftEvent(TimeLeftEvent ev) { // process event.. } 

Y luego cuando su servicio ejecutar una declaración como esta:

 bus.post(new TimeLeftEvent(340)); 

Que POJO se pasará a su actividad anterior y todos los demás componentes de suscripción. Simple y elegante.

Usted puede obtener los valores a través de receptor de radiodifusión …… como sigue, Primero crear su propio IntentFilter como,

 Intent intentFilter=new IntentFilter(); intentFilter.addAction("YOUR_INTENT_FILTER"); 

A continuación, cree la clase interna BroadcastReceiver como,

  private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { /** Receives the broadcast that has been fired */ @Override public void onReceive(Context context, Intent intent) { if(intent.getAction()=="YOUR_INTENT_FILTER"){ //HERE YOU WILL GET VALUES FROM BROADCAST THROUGH INTENT EDIT YOUR TEXTVIEW/////////// String receivedValue=intent.getStringExtra("KEY"); } } }; 

Ahora registre su receptor de Broadcast en onResume () como,

 registerReceiver(broadcastReceiver, intentFilter); 

Y, finalmente, Unregister BroadcastReceiver en onDestroy () como,

 unregisterReceiver(broadcastReceiver); 

Ahora la parte más importante … Necesitas disparar la emisión desde donde necesites enviar valores ….. así que haz como,

 Intent i=new Intent(); i.setAction("YOUR_INTENT_FILTER"); i.putExtra("KEY", "YOUR_VALUE"); sendBroadcast(i); 

Aplausos

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.