Android: Overlay-Fenster, über die Aktivitäten einer Aufgabe
Wollte ich ein Overlay erstellen, wie ein HUD, die sich auf dem Bildschirm während
meine Anwendungen activity-stack (die Aufgabe meiner app) verpasst.
Fand ich ein paar Beispiele für die Verwendung von WindowManager, aber ich konnte nicht herausfinden, die Parametrisierung für die richtige z-index, wenn Sie wollen. Es war entweder zu schwach, die nächste Aktivität gehen würde, ontop meiner overlay oder zu stark die überlagerung wurde eine system-wide-overlay, das war sichtbar, auch wenn die app in den hintergrund gerückt.
Mein Ziel für die Anzeige einer Sicht auf alle Aktivitäten gehören zu meinem app oder task (app wäre bevorzugt). Ich bin mir bewusst, dass apps und Aufgaben sind zwei verschiedene Dinge, die auf android -...
Was ich explizit nicht wollen, ist auf system-wide windows erfordern android.die Genehmigung.SYSTEM_ALERT_WINDOW
--- mein Anwendungsfall --
Ich die Umsetzung einer Strömung, die eine Aktivität bietet ein Formular für Benutzereingaben. dass die Benutzereingaben verarbeitet werden in eine sehr komplexe Art und Weise, woraus sich ein mögliches Ergebnis von +/- 10 Staaten. Die Bearbeitung kann bis zu 10 Minuten dauern und je nach Ausgang des Prozesses möchte ich anzeigen, um eine entsprechende Ansicht. Während der Prozess läuft, ich Absicht, um den Benutzer aktualisiert, aber die können ihm nicht erlauben, navigieren in der app (außer beim Abbruch des Prozesses). Jedes mögliche Ergebnis des lang andauernden Betrieb in einer anderen Aktivität.
Ich bin mir wohl bewusst, dass es mehrere Ansätze möglich (zum Beispiel mit einer Aktivität nur). Aber die Entscheidung wurde bereits getroffen und ist nicht Gegenstand der Frage. Ich habe implementiert eine Lösung, die verwendet, Windows-System zur Anzeige von overlay in. Zum ausblenden der Overlays habe ich zu zählen, onStart, onStop Ereignisse und interpretieren "- App hat sich zu bewegen in den hintergrund" und "- App hat Einzug in den Vordergrund". Das fühlt sich schmutzig, und ich bin nicht zufrieden mit dieser Lösung. Ich würde eher einen Schritt zurück machen und meine overlay auf der Oberseite des aufrufenden Aktivität und nach Abschluss des Prozesses verstecken und sich vorwärts zu bewegen, um die Aktivität das Ergebnis angezeigt wird.
Eine weitere Sache, die ich versucht habe, ist das verschieben einer Ansicht von einer Aktivität zur anderen. Aber diese zeigt einige flackern und die Unterbrechung der meine animation, die ich nicht mag.
Ich würde es begrüßen, wenn wir den Fokus auf die Frage, ob es möglich ist, einen Blick auf die Spitze der Anwendung/task-Fenster statt, die in einem system oder Fenster Aktivität 😉
- es scheint mir, dass die einzige Aktivität der breiten-oder system-wide windows verfügbar sind....
- Würde das overlay reagiert auf touch events?
- warum nicht Sie geben Sie die gewünschte Ansicht auf der alle Aktivitäten von xml? Denn selbst wenn wir einen Weg finden, um anzeigen, die eine überlagerung auf der Oberseite der alle Ihre Aktivitäten in der runtime wird es entweder - 1.) Sperren Sie Ihre Aktivität oder 2.) Verlieren den Fokus, wenn Ihre Aktivitäten sind angeklickt/berührt/aufgerufen.... Auch könnten Sie bitte erklären, mehr über Ihre Absichten, und ich.e, was genau Sie anzeigen wollen, dass die overlay-Ansicht und wie soll es reagieren? Jede Bezugnahme auf einen vorhandenen app mit dem gleichen feature wird leicht zu verstehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich glaube, das folgende wird für Sie von Interesse sein. Sie wird nicht verlangen
android.permission.SYSTEM_ALERT_WINDOW
. Der code ist für die Anwendung Klasse.Kommentare sollen Ihnen helfen, die Logik zu verstehen. Der code sollte funktionieren direkt aus der box.
Application
(nicht - Aktivität) Klasse und den code.ll = new LinearLayout(this);
erstellen Sie IhreImageView
und fügen Sie es zull
:ll.addView(yourImageView)
. Alternativ können Sie die popup-Ansicht im xml und Befüllen zur Laufzeit.Du wirklich nur zwei Optionen.
1) können Sie eine Aktivität mit dem Thema Thema.Dialog. Es erscheint ein popup am oberen Rand des Fensters. Sie können den dialog modal sein-weniger (kann durch klicken). In meinem quick-Test habe ich war nicht in der Lage zu bekommen überlagerung der Kanten von meinem Bildschirm, obwohl vielleicht ändern hätte das Thema beheben.
MainActivity.java
SecondActivity.java
Manifest
2) Die zweite Möglichkeit ist die Verwendung eines SYSTEM_ALERT_WINDOW. Ich bevorzuge diese Methode deutlich mehr. Sie sind richtig, dass es sein KANN, sichtbar und oben auf jeder anderen app, Sie können jedoch Steuern, wenn es sichtbar ist und Wann nicht. Ich werde nicht zu veröffentlichen source code, aber ich gebe Ihnen einen Allgemeinen plan des Angriffs.
Beim erstellen der service, binden Sie es mit einer AIDL. Auf diese Weise werden Sie in der Lage, sprechen Sie direkt mit dem service zu sagen, wenn es zu 'verstecken' und 'zeigen' das overlay. Apropos aus-und einblenden, onPause und onResume kann verwendet werden, um zu sagen, der service, sich zu verstecken und zeigen Sie das overlay. Schließlich, wenn Sie brauchen, um zu erhalten, klicken Sie auf Ereignisse auf Ihrem overlay, das beweisen wird schwierig sein, da die touch-events nicht immer so Verhalten, wie Sie es von Ihnen erwarten.
Glück.