Domanda

Ho provato a cercare su Google e non c'è risposta diretta e/o chiara.

Il Sito Web sviluppatoreLa definizione non è chiara

L'interfaccia che le app utilizzano per parlare con il gestore Windows. Uso Context.getSystemService(Context.WINDOW_SERVICE) per ottenere uno di questi.

Qualcuno con un semplice inglese di sesta elementare può spiegare di cosa si tratta?

E come posso usarlo per creare un oggetto galleggiante che rimane tramite diverse attivi, anche se sono passato da uno all'altro?

È stato utile?

Soluzione

Android WindowManager è un servizio di sistema, che è responsabile della gestione dell'elenco di Windows ordinato Z, che sono visibili Windows e come sono disposte sullo schermo. Tra le altre cose, esegue automaticamente le transizioni e le animazioni della finestra durante l'apertura o la chiusura di un'app o la rotazione dello schermo.

Ogni attività ha una finestra utilizzata per visualizzare il suo contenuto sullo schermo. Quando si chiama SetContentView su un'attività, si collega alla finestra predefinita dell'attività. La finestra predefinita riempie lo schermo, in modo che la finestra della tua attività nasconda qualsiasi altra attività: il manager di Windows visualizzerà qualunque finestra sia in cima. Quindi normalmente non devi preoccuparti di Windows: crei semplicemente un'attività e Android farà il resto per te.

Ma devi interagire con WindowsManager se vuoi fare qualcosa di insolito come creare finestre galleggianti che non riempiono lo schermo. Se si desidera creare una finestra mobile visibile davanti ad altre applicazioni, non è possibile utilizzare un'attività perché la tua attività si fermerà quando un'altra app verrà in primo piano e la sua finestra sarà nascosta o distrutta. Invece è necessario visualizzare una finestra da un servizio di fondo. Per esempio:

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

Affinché questo funzioni, dovrai aggiungere la seguente autorizzazione al tuo AndroidManifest.xml

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

Altri suggerimenti

Per la versione API Android> 23, android.permission.SYSTEM_ALERT_WINDOW È necessario richiedere il runtime. Inoltre, TYPE_SYSTEM_ERROR e alcuni tipi sono deprecati nell'API Android 26. Ecco il modo

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

Windows Manager organizza lo schermo e procede cosa dovrebbe andare dove e come dovrebbero essere stratificati.

Ecco un bell'esempio open source di un oggetto galleggiante.Esempio di oggetti galleggianti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top