Actualización de la interfaz de usuario desde un servicio (mediante un controlador?)
Estoy tratando de actualizar mi interfaz de usuario en FirstActivity
cuando recibo una notificación pero se confunde con runOnUiThread
, Runnable
y Handler
. Esto es lo que tengo: Estoy ejecutando FirstActivity y NotificationService. Cuando NotificationService reciba una notificación, actualizará la interfaz de usuario de FirstActivity.
También tengo otro servicio que AlarmService
ejecutando AlarmService
. Primera Actividad
- ¿Cómo actualizo el texto de notificación de un servicio de primer plano en Android?
- 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
- Android: mensajes de Handler retrasados al final del hilo de trabajo
@Override public void onResume() { super.onResume(); //some other code for alarm service }
NotificationService
//on receiving notification private void showNotification(String text) { //Get activity Class<?> activityClass = null; try { activityClass = Class.forName("com.pakage.FirstActivity"); contextActivity = (Activity) activityClass.newInstance(); //Update UI on FirstActivity not working contextActivity.runOnUiThread(new Runnable() { public void run() { Looper.prepare(); TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest); Looper.loop(); } }); } catch (Exception e) { e.printStackTrace(); } //Shows the notification Notification n = new Notification(); //... etc }
Sigo recibiendo looper.prepare error. ¿Necesito agregar códigos adicionales en mi FirstActivity?
- Ocultar notificación de servicio de primer plano mientras la actividad es visible
- Acceso al controlador de subprocesos de interfaz de usuario desde un servicio
- El servicio de Android no se puede iniciar debido a un ClassNotFoundException de una clase que ya no existe
- Servicio con Overlay - presione el botón de retroceso
- Cómo habilitar / deshabilitar el servicio de accesibilidad mediante programación en Android
- Cómo actualizar la ubicación de google map v2 desde el servicio de fondo android
Mi primer instinto es que en su lugar debes tener la actividad enlazar a tu servicio y manejar la actualización de la interfaz de usuario de su lado en lugar del servicio que modifica directamente la actividad.
Ver más información aquí:
http://developer.android.com/reference/android/app/Service.html#LocalServiceSample
Y un ejemplo aquí:
Ejemplo: Comunicación entre actividad y servicio mediante mensajería
Siempre he tenido el fuego de servicio de una difusión y luego en mi actividad tengo un BroadcastReciever escuchando para la difusión. Es un enfoque que es mucho más simple que el que se ha descrito anteriormente.
No tengo ni idea de por qué estás poniendo un Looper en
contextActivity.runOnUiThread(new Runnable() { public void run() { Looper.prepare(); TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest); Looper.loop(); } });
Porque el hilo de la interfaz de usuario (principal) ya tiene un Looper / Handler etc.
Incluso si funcionó Looper.loop()
va a bloquear y ya que lo está ejecutando en el hilo de interfaz de usuario, bloqueará el subproceso de interfaz de usuario que no es lo que desea.
Lo que realmente quieres hacer es
contextActivity.runOnUiThread(new Runnable() { public void run() { TextView tv = (TextView ) contextActivity.findViewById(R.id.notifyTest); tv.setText("do something that must be on UI thread") // or whatever } });
Usted realmente no necesita hacer todas estas cosas de lujo para obtener la Actividad
activityClass = Class.forName("com.pakage.FirstActivity"); contextActivity = (Activity) activityClass.newInstance();
Suponiendo que el Servicio y la Actividad estén ejecutándose en el mismo proceso, sólo puede guardar una referencia a la Actividad pero tenga cuidado de actualizar la referencia cuando la Actividad se destruya.