net - ¿Qué es WindowManager en Android?
windowmanager layoutparams flag_secure (3)
Intenté buscar en Google y no hay una respuesta directa y / o clara.
La definición del sitio web del desarrollador tampoco está clara:
La interfaz que utilizan las aplicaciones para hablar con el administrador de ventanas. Use
Context.getSystemService(Context.WINDOW_SERVICE)
para obtener uno de estos.
¿Puede alguien con un inglés sencillo de 6º grado explicar qué es?
¿Y cómo puedo usarlo para crear un objeto flotante que se mantiene a través de varias actividades, a pesar de que me mudé de una a la otra?
El Android WindowManager es un servicio del sistema, que se encarga de gestionar la lista ordenada z de ventanas, qué ventanas son visibles y cómo se distribuyen en la pantalla. Entre otras cosas, realiza automáticamente transiciones de ventanas y animaciones al abrir o cerrar una aplicación o al girar la pantalla.
Cada actividad tiene una ventana que se usa para mostrar su contenido en la pantalla. Cuando llama a setContentView en una actividad, adjunta esa vista a la ventana predeterminada de la actividad. La ventana predeterminada llena la pantalla, de modo que la ventana de su actividad oculta cualquier otra actividad: el WindowManager mostrará la ventana que esté arriba. Por lo tanto, normalmente no tiene que preocuparse por Windows, solo crea una actividad y Android hará el resto por usted.
Pero debe interactuar con WindowManager si desea hacer algo inusual como crear ventanas flotantes que no llenen la pantalla. Si desea crear una ventana flotante que esté visible frente a otras aplicaciones, no puede usar una actividad porque su actividad se detendrá cuando otra aplicación aparezca en primer plano, y su ventana se ocultará o destruirá. En su lugar, debe mostrar una ventana de un servicio en segundo plano. Por ejemplo:
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);
Para que esto funcione, deberás agregar los siguientes permisos a tu AndroidManifest.xml
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
El administrador de ventanas organiza la pantalla y procesa lo que debe ir a dónde y cómo se deben superponer.
Aquí hay un buen ejemplo de código abierto de un objeto flotante. Ejemplo de objeto flotante
Para la versión de la API de Android> 23, android.permission.SYSTEM_ALERT_WINDOW
necesita solicitar el tiempo de ejecución. Por otra parte, TYPE_SYSTEM_ERROR
y algunos pocos tipos están en desuso en Android api 26. Aquí está el camino
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;
}