Android: Overlay auf Fenster über Aktivitäten einer Aufgabe

8

Ich wollte ein Overlay wie ein HUD erstellen, das sich während des Spiels auf dem Bildschirm befindet Mein Anwendungsaktivitätsstapel (die Aufgabe meiner App) ändert sich.

Ich habe ein paar Beispiele mit WindowManager gefunden, aber ich konnte die Parametrierung für den richtigen Z-Index nicht herausfinden, wenn Sie möchten. Es war entweder zu schwach die nächste Aktivität würde über meine Überlagerung gehen oder zu stark war die Überlagerung eine systemweite Überlagerung, die auch sichtbar wurde, wenn die App in den Hintergrund rückte.

Ich möchte eine Übersicht über alle Aktivitäten meiner App oder Aufgabe anzeigen (App wäre bevorzugt). Ich bin mir bewusst, dass Apps und Aufgaben zwei verschiedene Dinge auf Android sind ...

Was ich explizit nicht möchte, ist systemweite Fenster zu verwenden, die android.permission.SYSTEM_ALERT_WINDOW benötigen

--- mein Anwendungsfall -

Ich implementiere einen Ablauf, der eine Aktivität enthält, die ein Formular für Benutzereingaben bereitstellt. diese Benutzereingabe muss in einer ziemlich komplexen Weise verarbeitet werden, was ein mögliches Ergebnis von +/- 10 Zuständen ergibt. Die Verarbeitung kann bis zu 10 Minuten dauern und abhängig vom Ergebnis dieses Prozesses möchte ich eine entsprechende Ansicht anzeigen. Während der Prozess läuft, beabsichtige ich, den Benutzer auf dem Laufenden zu halten, kann ihm aber nicht erlauben, durch die App zu navigieren (außer den Prozess abzubrechen). Jedes mögliche Ergebnis der Langzeitoperation wird in einer anderen Aktivität vorgestellt.

Ich bin mir bewusst, dass mehrere Ansätze möglich sind (zum Beispiel nur eine Aktivität). Aber diese Entscheidung ist bereits getroffen worden und liegt außerhalb des Rahmens dieser Frage. Ich habe eine Lösung implementiert, die System Windows verwendet, um diese Überlagerung anzuzeigen. Zum Ausblenden der Überlagerung muss ich aufStart, onStop Ereignisse zählen und interpretieren "App ist in den Hintergrund gerückt" und "App ist in den Vordergrund gerückt". Das fühlt sich schmutzig an und ich bin mit dieser Lösung nicht zufrieden. Ich würde lieber einen Schritt zurückgehen und mein Overlay über der aufrufenden Aktivität anzeigen und nach Beendigung des Prozesses es ausblenden und zu der Aktivität weitergehen, die das Ergebnis anzeigt.

Noch eine Sache, die ich versuchte, ist, eine Ansicht von einer Aktivität zu einer anderen zu verschieben. Aber das zeigt ein Flackern und eine Unterbrechung meiner Animation, die ich nicht mag.

Ich würde es begrüßen, wenn wir uns auf die Frage konzentrieren könnten, ob es möglich ist, eine Ansicht oberhalb des Anwendungs- / Aufgabenfensters anstatt innerhalb eines System- oder Aktivitätsfensters anzuzeigen;)

    
Jakob 17.09.2013, 07:32
quelle

3 Antworten

8

Ich denke, das Folgende wird Sie interessieren. Sie benötigen nicht android.permission.SYSTEM_ALERT_WINDOW . Der Code ist für die Klasse Application.

Kommentare sollten Ihnen helfen, die Logik zu verstehen. Der Code sollte direkt aus der Box funktionieren.

%Vor%     
Vikram 26.09.2013, 19:41
quelle
10

Sie haben wirklich nur zwei Möglichkeiten.

1) Sie können eine Aktivität mit dem Thema Theme.Dialog erstellen. Dies wird ein Popup oben auf Ihrem Fenster anzeigen. Sie können den Dialog als modalfrei (durchklicken) erstellen. Bei meinen schnellen Tests konnte ich die Ränder meines Bildschirms nicht überlagern, obwohl das Ändern des Themas das Problem beheben könnte.

MainActivity.java

%Vor%

SecondActivity.java

%Vor%

Manifestieren

%Vor%

2) Die zweite Option ist die Verwendung von SYSTEM_ALERT_WINDOW. Ich bevorzuge diese Methode deutlich mehr. Sie sind richtig, dass es sichtbar sein kann und oben auf jeder anderen App, jedoch können Sie steuern, wann es sichtbar ist und wann nicht. Ich werde keinen Quellcode veröffentlichen, aber ich werde Ihnen einen allgemeinen Angriffsplan geben.

Wenn Sie den Service erstellen, binden Sie ihn mithilfe einer AIDL. Auf diese Weise können Sie direkt mit dem Service sprechen, um zu erfahren, wann das Overlay "versteckt" und "angezeigt" werden soll. Apropos Verstecken und Zeigen, onPause und onResume können verwendet werden, um dem Dienst zu sagen, dass er das Overlay ausblenden und anzeigen soll. Schließlich, wenn Sie Click-Ereignisse auf Ihrem Overlay erhalten müssen, wird das schwierig, da die Touch-Ereignisse nicht immer so funktionieren, wie Sie es erwarten.

Viel Glück.

    
Randy 24.09.2013 07:52
quelle
0

Hoffe, das hilft

%Vor%     
Vadim Bryl 20.12.2016 13:27
quelle

Tags und Links