Подтвердить что ты не робот

Что такое WindowManager в android?

Я пробовал искать его, и нет прямого и/или четкого ответа.

Определение сайта разработчика:

Интерфейс, который приложения используют для работы с диспетчером окон. использование Context.getSystemService(Context.WINDOW_SERVICE), чтобы получить один из них.

Может ли кто-нибудь с простым языком 6-го класса объяснить, что это такое?

И как я могу использовать его для создания плавающего объекта, который остается через несколько функций, хотя я перешел от одного к другому?

4b9b3361

Ответ 1

Android WindowManager - это системная служба, которая отвечает за управление z-упорядоченным списком окон, какие окна видны и как они выложены на экране. Помимо прочего, он автоматически выполняет переходы окон и анимацию при открытии или закрытии приложения или при вращении экрана.

Каждое действие имеет окно, которое используется для отображения его содержимого на экране. Когда вы вызываете setContentView в действии, он прикрепляет это представление к окну активности по умолчанию. Окно по умолчанию заполняет экран, так что ваше окно активности скрывает любые другие действия - WindowManager отобразит любое окно сверху. Поэтому, как правило, вам не нужно беспокоиться о Windows - вы просто создаете активность, и Android сделает все для вас.

Но вам нужно взаимодействовать с WindowManager, если вы хотите сделать что-то необычное, например создавать плавающие окна, которые не заполняют экран. Если вы хотите создать плавающее окно, которое видно перед другими приложениями, вы не можете использовать действие, потому что ваша деятельность остановится, когда другое приложение появится на переднем плане, и его окно будет скрыто или уничтожено. Вместо этого вам нужно отобразить окно из фоновой службы. Например:

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

Для этого вам нужно будет добавить следующие разрешения на ваш AndroidManifest.xml

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

Ответ 2

Диспетчер окон организует экран и обрабатывает то, что должно идти туда, где и как они должны быть слоистыми.

Вот хороший пример с открытым исходным кодом для плавающего объекта. Пример с плавающим объектом

Ответ 3

Для android версии api > 23, android.permission.SYSTEM_ALERT_WINDOW необходимо запросить время выполнения. Более того, TYPE_SYSTEM_ERROR и несколько типов устаревают в android api 26. Вот путь

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