2009-06-22 23 views
9

Necesito un diálogo emergente para mostrar cuando recibo un mensaje de un hilo diferente, pero el diálogo no debe depender de la actividad, es decir, debe mostrar el diálogo donde sea que esté el foco de la pantalla.Diálogo emergente Android desde el hilo de fondo

¿Se puede hacer? Debido a que el diálogo se maneja por Actividad, pensé en usar un servicio, pero nuevamente sería un hilo más agregado y quiero evitarlo.

¿Hay otras opciones disponibles?

+0

Creo que está tratando de preguntar esto: ¿Cómo se puede iniciar un diálogo desde un servicio que se ejecuta en un hilo separado? Puede haber cualquier cantidad de actividades en ejecución. Para mostrar un diálogo, debe especificar la actividad actual. –

+0

Una posible solución es utilizar una actividad: http://stackoverflow.com/posts/3912748/revisions –

+0

https://stackoverflow.com/a/29804684/2149195 – RBK

Respuesta

17

Si está intentando preguntar cómo mostrar un cuadro de diálogo cuando su actividad no es la actividad enfocada en el teléfono del usuario, intente usar Notificaciones en su lugar. Abrir un diálogo sobre una aplicación diferente interrumpe al usuario cuando pueden estar haciendo otra cosa. De los Android UI guidelines:

uso del sistema de notificación - no cuadros de diálogo en lugar de la utilización notificaciones

Si su servicio en segundo plano necesita notificar a un usuario, utilice el sistema de notificación estándar - No use un cuadro de diálogo ni pan tostado para notificarlos. Un tostadas diálogo o tomaría inmediatamente enfoque e interrumpir al usuario, teniendo foco lejos de lo que estaban haciendo: el usuario podría estar en el medio de escribiendo texto el momento en el cuadro de diálogo aparece y, accidentalmente, podría actuar en la diálogo. Los usuarios están acostumbrados a tratar con notificaciones y pueden desplegar el tono de notificación en su para responder a su mensaje .

Una guía para crear avisos está aquí: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

+0

hola, Como teléfono tengo delegado de la aplicación que siempre escuchar los cambios en la interfaz de usuario ¿hay algo similar en Android? – Sam97305421562

+0

Facebook Messenger (Bubbles) no sigue esta regla. . . – sospedra

+0

@Bursos No estoy seguro de cuál es su punto. Facebook a menudo no sigue las pautas de UI de Android. Además, las burbujas no se apoderan de la entrada del usuario como lo haría un cuadro de diálogo. – Intrications

1

solución alternativa:

AlertDialog dialog; 
//add this to your code 
    dialog = builder.create(); 
    Window window = dialog.getWindow(); 
    WindowManager.LayoutParams lp = window.getAttributes(); 
    lp.token = mInputView.getWindowToken(); 
    lp.type = WindowManager.LayoutParams.TYPE_APPLICATION_ATTACHED_DIALOG; 
    window.setAttributes(lp); 
    window.addFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM); 
//end addons 
alert.show(); 
+1

Entonces ... ¿dónde crees que podría obtener un mInputView en un hilo de fondo? ;) – Janusz

+0

(nuevo AlertDialog.Builder (myAppContext)). Create() me da java.lang.RuntimeException: No se puede crear el controlador dentro de la hebra que no ha llamado a Looper.prepare(). –

+0

debe usar el contexto de la actividad y no el contexto de la aplicación. – Sulby

1

si he entendido bien se puede utilizar una clase base para todas sus actividades

public abstract class BaseActivity extends Activity{ 
    protected static BaseActivity current_context = null; 

    @override 
    protected void onPause(){ 
     current_context = null; 
     super.onPause(); 
    } 

    @override 
    protected void onResume(){ 
     current_context = this; 
     super.onResume(); 
    } 

    public static void showDialog(/*your parameters*/){ 
     //show nothing, if no activity has focus 
     if(current_context == null)return; 
     current_context.runOnUiThread(new Runnable() { 
      @override 
      public void run(){ 
       AlertDialog.Builder builder = 
        new AlertDialog.Builder(current_context); 
       //your dialog initialization 
       builder.show(); 
      } 
     }); 
    } 
} 

en su hilo muestra su diálogo con BaseActivity.showDialog(..) Pero este enfoque no funciona si desea mostrar su cuadro de diálogo en la parte superior de cualquier actividad del dispositivo de destino.

Cuestiones relacionadas