Pergunta

Eu tentei pesquisar no Google e não há resposta direta e/ou clara.

o Site do desenvolvedorA definição também não está clara:

A interface que os aplicativos usam para conversar com o gerenciador de janelas. Usar Context.getSystemService(Context.WINDOW_SERVICE) Para conseguir um desses.

Alguém com o inglês da 6ª série da 6ª série pode explicar o que é?

E como posso usá -lo para criar um objeto flutuante que permaneça através de várias atividades, mesmo que eu tenha mudado de um para o outro?

Foi útil?

Solução

O Android WindowManager é um serviço de sistema, responsável pelo gerenciamento da lista de Windows ordenada por Z, que as janelas são visíveis e como elas são colocadas na tela. Entre outras coisas, ele executa automaticamente transições e animações de janela ao abrir ou fechar um aplicativo ou girar a tela.

Toda atividade possui uma janela usada para exibir seu conteúdo na tela. Quando você chama o setContentView em uma atividade, ele anexa essa visualização à janela padrão da atividade. A janela padrão preenche a tela, para que a janela da sua atividade ocorra outras atividades - o WindowManager exibirá a janela que estiver na parte superior. Portanto, normalmente você não precisa se preocupar com o Windows - basta criar uma atividade e o Android fará o resto por você.

Mas você precisa interagir com o WindowManager se quiser fazer algo incomum como criar janelas flutuantes que não preenchem a tela. Se você deseja criar uma janela flutuante visível na frente de outras aplicações, não pode usar uma atividade porque sua atividade parará quando outro aplicativo chegar ao primeiro plano e sua janela será escondida ou destruída. Em vez disso, você precisa exibir uma janela de um serviço de segundo plano. Por exemplo:

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 isso funcione, você precisará adicionar a seguinte permissão ao seu AndroidManifest.xml

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

Outras dicas

Para Android API Version> 23, android.permission.SYSTEM_ALERT_WINDOW precisa solicitar tempo de execução. Além disso, TYPE_SYSTEM_ERROR e alguns poucos tipos estão depreciados na API Android 26. Aqui está o caminho

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

O Window Manager organiza a tela e processa o que deve ir para onde e como eles devem ser colocados em camadas.

Aqui está um bom exemplo de código aberto de um objeto flutuante.Exemplo de objeto flutuante

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top