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

 @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?

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.

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