Frage

Ich habe versucht, es zu googeln und es gibt keine direkte und/oder klare Antwort.

Das EntwicklerwebsiteDie Definition ist auch nicht klar:

Die Schnittstelle, mit der Apps mit dem Fenstermanager sprechen. Verwenden Context.getSystemService(Context.WINDOW_SERVICE) um eines davon zu bekommen.

Kann jemand mit einfachem Englisch der 6. Klasse erklären, was es ist?

Und wie kann ich es verwenden, um ein schwimmendes Objekt zu erstellen, das über mehrere Aktivitäten verbleibt, obwohl ich von einem zum anderen wechselte?

War es hilfreich?

Lösung

Der Android WindowManager ist ein Systemdienst, der für die Verwaltung der Z-Order-Liste der Windows verantwortlich ist, die Windows sichtbar sind und wie sie auf dem Bildschirm angelegt werden. Unter anderem führt es automatisch Fensterübergänge und Animationen durch, wenn sie eine App öffnen oder schließen oder den Bildschirm drehen.

Jede Aktivität verfügt über ein Fenster, mit dem der Inhalt auf dem Bildschirm angezeigt wird. Wenn Sie SetContentView bei einer Aktivität aufrufen, wird diese Ansicht zum Standardfenster der Aktivität angeschlossen. Das Standardfenster füllt den Bildschirm aus, so dass das Fenster Ihrer Aktivität alle anderen Aktivitäten verbirgt - der WindowsManager zeigt an, welches Fenster oben ist. Normalerweise müssen Sie sich also keine Sorgen um Windows machen - Sie erstellen nur eine Aktivität und Android macht den Rest für Sie.

Sie müssen jedoch mit dem WindowsManager interagieren, wenn Sie etwas Ungewöhnliches tun möchten, wie schwimmende Fenster zu erstellen, die den Bildschirm nicht füllen. Wenn Sie ein schwimmendes Fenster erstellen möchten, das vor anderen Anwendungen sichtbar ist, können Sie keine Aktivität verwenden, da Ihre Aktivität aufhört, wenn eine andere App in den Vordergrund steht und sein Fenster verborgen oder zerstört wird. Stattdessen müssen Sie ein Fenster aus einem Hintergrunddienst anzeigen. Zum Beispiel:

WindowManager.LayoutParams p = new WindowManager.LayoutParams(
    // Shrink the window to wrap the content rather than filling the screen 
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    // Display it on top of other application windows, but only for the current user
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    // Don't let it grab the input focus
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    // Make the underlying application window visible through any transparent parts
    PixelFormat.TRANSLUCENT);

// Define the position of the window within the screen
p.gravity = Gravity.TOP | Gravity.RIGHT;
p.x = 0;
p.y = 100;

WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
windowManager.addView(myView, p);

Damit dies funktioniert, müssen Sie die folgende Erlaubnis zu Ihrem AndroidManifest.xml hinzufügen

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Andere Tipps

Für Android -API -Version> 23, android.permission.SYSTEM_ALERT_WINDOW müssen Laufzeit anfordern. Darüber hinaus, TYPE_SYSTEM_ERROR und einige wenige Typen sind in Android API 26 veraltet. Hier ist der Weg

public void showWindowManager() {
    if (requestPermission()) {
        return;
    }

    WindowManager.LayoutParams p =
            new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    Build.VERSION.SDK_INT > Build.VERSION_CODES.O
                            ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                            : WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);


    final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater layoutInflater =
            (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    final View popupView = layoutInflater.inflate(R.layout.window_manager_layout, null);
    windowManager.addView(popupView, p);

    // dismiss windowManager after 3s
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            windowManager.removeView(popupView);
        }
    }, 3000);
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            showWindowManager();
        }
    }
}

public boolean requestPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
            return true;
        }
    }
    return false;
}

Der Fenstermanager organisiert den Bildschirm und verarbeitet das, was wohin und wie er geschichtet werden soll.

Hier ist ein schönes Open -Source -Beispiel für ein schwimmendes Objekt.Beispiel für schwimmendes Objekt

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top