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:
- ¿Cómo actualizo el texto de notificación de un servicio de primer plano en Android?
- Ocultar notificación de servicio de primer plano mientras la actividad es visible
- El servicio de Android no se puede iniciar debido a un ClassNotFoundException de una clase que ya no existe
- Cómo habilitar / deshabilitar el servicio de accesibilidad mediante programación en Android
- Servicio con Overlay - presione el botón de retroceso
- El subproceso de interfaz de usuario tiene su propio controlador y looper
- Cualquier mensaje se colocará en la cola de mensajes del subproceso de la interfaz de usuario
- El looper capta el evento y lo pasa al manejador
- 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
- Cómo actualizar la ubicación de google map v2 desde el servicio de fondo android
- Android: mensajes de Handler retrasados al final del hilo de trabajo
- Actualización de la interfaz de usuario desde un servicio (mediante un controlador?)
- Habilitar GPS programáticamente Android (sin navegar a los ajustes de ubicación)
- Comprobar si el usuario ha concedido NotificationListener acceso a mi aplicación
- Realizar cambios en la interfaz de usuario de la actividad principal desde el subproceso en Service
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