Question

J'ai essayé de le googler et il n'y a pas de réponse directe et / ou claire.

La site Web du développeurLa définition n'est pas non plus claire:

L'interface que les applications utilisent pour parler au gestionnaire de fenêtres. Utilisation Context.getSystemService(Context.WINDOW_SERVICE) pour en obtenir un.

Quelqu'un avec un anglais de 6e année en simple peut-il expliquer ce que c'est?

Et comment puis-je l'utiliser pour créer un objet flottant qui reste via plusieurs activités, même si je suis passé de l'un à l'autre?

Était-ce utile?

La solution

L'Android WindowManager est un service système, qui est responsable de la gestion de la liste des fenêtres commandée par Z, quelles fenêtres sont visibles et comment elles sont disposées à l'écran. Entre autres choses, il effectue automatiquement des transitions et des animations de fenêtres lors de l'ouverture ou de la fermeture d'une application ou de la rotation de l'écran.

Chaque activité a une fenêtre utilisée pour afficher son contenu à l'écran. Lorsque vous appelez setContentView sur une activité, il attache cette vue à la fenêtre par défaut de l'activité. La fenêtre par défaut remplit l'écran, de sorte que la fenêtre de votre activité masque toutes les autres activités - le WindowManager affichera la fenêtre en haut. Donc, normalement, vous n'avez pas à vous soucier de Windows - vous créez simplement une activité et Android fera le reste pour vous.

Mais vous devez interagir avec le WindowManager si vous voulez faire quelque chose d'inhabituel comme créer des fenêtres flottantes qui ne remplissent pas l'écran. Si vous souhaitez créer une fenêtre flottante qui est visible devant d'autres applications, vous ne pouvez pas utiliser une activité car votre activité s'arrêtera lorsqu'une autre application arrivera au premier plan, et sa fenêtre sera cachée ou détruite. Au lieu de cela, vous devez afficher une fenêtre à partir d'un service d'arrière-plan. Par exemple:

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

Pour que cela fonctionne, vous devrez ajouter l'autorisation suivante à votre AndroidManifest.xml

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

Autres conseils

Pour la version Android API> 23, android.permission.SYSTEM_ALERT_WINDOW Besoin de demander l'exécution. En outre, TYPE_SYSTEM_ERROR Et quelques types sont obsolètes dans Android API 26. Voici le chemin

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

Window Manager organise l'écran et traite ce qui devrait aller où et comment ils doivent être superposés.

Voici un bel exemple open source d'un objet flottant.Exemple d'objet flottant

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top