2017-04-12 1 views
1

Um einen Benutzer zu benachrichtigen benutze ich einen AlertDialog oder eine Snanckbar. Sie benötigen beide einen Aktivitätskontext, um angezeigt zu werden. Drei Fälle:Benutzerbenachrichtigung braucht Kontext

  • Nachricht von der aktuellen Aktivität erzeugt: das ist trivial
  • Nachricht von einem anderen Thread erzeugt: Ich bin der Umsetzung eines Broadcast/Empfangsmuster so der Thread die Nachricht übertragen können und die Aktivität erhält und zeigt die Meldung
  • Nachricht von einer Schließ Aktivität erzeugt, zB Aktivität Master-Start-Aktivität Selector, der Benutzer eine Option auswählt, tun Sie den Code ein paar Sachen und dann zum Master zurück

    // Selector activity draft sample 
    mButtonSeelcted.setOnClickListener(new OnClickListener() { 
    @Override 
        public void onClick(View view) { 
        super.onClick(view); 
        doMagicForSelected(); 
        mContext.sendBroadcast(intentForUserMessage); 
        mContext.startActivity(intentToMasterActivity); 
        } 
    }); 
    

Jetzt wird die Nachricht nicht angezeigt, weil die Selector-Aktivität zu dem Zeitpunkt abgeschlossen ist, zu dem der Empfänger startet. Außerdem gibt es eine WindowLeaked-Ausnahme, da der AlertDialog nie beendet wird.

Irgendwelche Gedanken? Gibt es ein Muster, das ich vermisse?

Antwort

1

Ich bin ein Broadcast/Empfänger Muster Umsetzung so der Thread die Nachricht übertragen kann und die Aktivität erhält und zeigt die Meldung

Bitte einen In-Prozess-Message-Bus verwenden (zB LocalBroadcastManager, greenrobots EventBus). Die Verwendung von System-Broadcasts verschwendet nicht nur CPU und Akku, sondern führt auch zu Sicherheitsproblemen (z. B. kann jede App Ihre Nachrichten ausspionieren).

Gibt es ein Muster, das ich vermisse?

In Ihrem dritten Szenario liegt es in der Verantwortung der "Hauptaktivität", diese Informationen anzuzeigen, nicht die Aktivität, die zerstört wird. Fügen Sie also Informationen zur Intent hinzu, die Sie an startActivity() übergeben, die die "Hauptaktivität" mitteilt, um diese Informationen anzuzeigen.

+0

Danke für die Leistung/Sicherheit Tipp :) Wenn die DoMagicGorSelected-Methode eine Ausnahme erhält, die an den Benutzer gesendet werden kann (z. B. Netzwerkprobleme), dann wird es die Nachricht senden. Diese Methode kennt den Master nicht. Ich denke, mein Punkt ist, wie ich mit der Tatsache umgehen sollte, dass der Kontext flüchtig ist und zerstört werden kann, während ich es benutze. – denispyr

+0

@denispyr: "Ich denke, mein Punkt ist, wie soll ich mit der Tatsache umgehen, dass der Kontext flüchtig ist und zerstört/verändert werden kann, während ich ihn benutze" - wenn der Master derjenige ist, der den Dialog oder die Snackbar zeigt keine Volatilität, und so verstehe ich die Sorge nicht. – CommonsWare

+0

lassen Sie mich klären. Wenn "doMagicForSelected()" eine "anzeigbare" Ausnahme (zB schlechte Eingabe) erhält, wird diese Nachricht in Bezug auf meinen Entwurfscode gesendet. Die Selector-Aktivität empfängt es und zeigt einen Dialog an. Wenn dies bei onLoadFinished passiert, dann werden keine Probleme auftreten, der Dialog wird angezeigt. Wenn es passiert, bevor die Aktivität beendet ist, bin ich in Schwierigkeiten.Gibt es ein Muster für diesen Fall? – denispyr

1
  1. starten Selector Aktivität (Aktivität B) von Meister Aktivität (Aktivität A) mit startActivityForResult().
  2. Zeigt den Dialog von Master Aktivität als Ergebnis.