2009-06-22 19 views
9

Ho bisogno di una finestra di dialogo popup da visualizzare quando ricevo un messaggio da thread diversi ma la finestra di dialogo non dovrebbe dipendere da Activity i.e, dovrebbe visualizzare la finestra di dialogo dovunque lo schermo sia attivo.Finestra di dialogo popup Android da thread in background

Si può fare? Poiché la finestra di dialogo è gestita per attività, ho pensato di utilizzare un servizio, ma ancora una volta sarebbe stato aggiunto un altro thread e voglio evitarlo.

Altre opzioni disponibili?

+0

Credo che stia provando a chiedergli questo: come è possibile avviare una finestra di dialogo da un servizio in esecuzione in un thread separato? Ci può essere un numero qualsiasi di attività in esecuzione. Per mostrare una finestra di dialogo, è necessario specificare l'attività corrente. –

+0

Una possibile soluzione è utilizzare un'attività: http://stackoverflow.com/posts/3912748/revisions –

+0

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

risposta

17

Se si sta tentando di chiedere come mostrare una finestra di dialogo quando l'attività non è focalizzata sul telefono dell'utente, provare a utilizzare invece Notifiche. Aprire una finestra di dialogo su un'applicazione diversa interrompe l'utente quando potrebbe fare qualcos'altro. Dalle Android UI guidelines:

Utilizzare il sistema di notifica - Non finestre di dialogo utilizzare al posto di notifiche

Se il servizio ha bisogno di sfondo notificare a un utente, utilizzare il sistema di notifica standard - non utilizzare una finestra di dialogo o un brindisi per avvisarli. Un brindisi dialogo o avrebbe immediatamente prendere messa a fuoco e interrompere l'utente, prendendo attenzione lontano da quello che stavano facendo: l'utente potrebbe essere nel bel mezzo di digitazione del testo al momento la finestra di dialogo appare e potrebbe accidentalmente agire sulla la dialogo. Gli utenti sono abituati a gestire con le notifiche e possono abbassare lo l'ombreggiatura di notifica nella loro convenienza per rispondere al tuo messaggio .

Una guida per creare le notifiche è qui: http://developer.android.com/guide/topics/ui/notifiers/notifications.html

+0

ciao, Come telefono ho delegato Application che sempre ascolta i cambiamenti dell'interfaccia utente c'è qualcosa di simile in Android? – Sam97305421562

+0

Facebook Messenger (Bubbles) non segue questa regola. . . – sospedra

+0

@Bursos Non sono sicuro di quale sia il tuo punto. Facebook spesso non segue le linee guida dell'interfaccia utente di Android. Inoltre, le bolle non prendono il controllo dell'utente come farebbe un dialogo. – Intrications

1

Soluzione 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

Quindi ... dove pensi che potrei ottenere un mInputView in un thread in background? ;) – Janusz

+0

(nuovo AlertDialog.Builder (myAppContext)). Create() mi dà java.lang.RuntimeException: Impossibile creare il gestore all'interno del thread che non ha chiamato Looper.prepare(). –

+0

devi utilizzare il contesto di attività e non il contesto dell'applicazione. – Sulby

1

se ho capito bene si potrebbe utilizzare una classe di base per tutte le vostre attività

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(); 
      } 
     }); 
    } 
} 

nella discussione mostra la finestra di dialogo con BaseActivity.showDialog(..) Ma questo approccio non funziona se vuoi mostrare la tua finestra di dialogo sopra qualsiasi attività del dispositivo di destinazione.

Problemi correlati