Вопрос

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

А Веб -сайт разработчикаОпределение тоже неясно:

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

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

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

Это было полезно?

Решение

Android Windowmanager-это системная служба, которая отвечает за управление Z-упорядоченным списком Windows, которые видят Windows, и как они выложены на экране. Среди прочего, он автоматически выполняет оконные переходы и анимации при открытии или закрытии приложения или вращении экрана.

Каждое действие имеет окно, которое используется для отображения своего контента на экране. Когда вы вызовите 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"/>

Другие советы

Для версии API API Android> 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;
}

Window Manager организует экран и обрабатывает то, что должно идти, куда и как они должны быть наложены.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top