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"/>