android中的WindowManager是什么?

时间:2013-11-07 20:56:37

标签: android android-windowmanager

我尝试使用谷歌搜索,并没有直接和/或明确的答案。

developer website的定义也不清楚:

  

应用程序用于与窗口管理器通信的界面。使用   Context.getSystemService(Context.WINDOW_SERVICE)获得其中一个。

普通六年级英语的人可以解释它是什么吗?

我怎样才能用它来创建一个浮动物体,这个物体通过几个活动保留,即使我从一个移动到另一个?

3 个答案:

答案 0 :(得分:122)

Android WindowManager是一个系统服务,负责管理z-ordered窗口列表,哪些窗口可见,以及它们如何在屏幕上布局。除此之外,它还可以在打开或关闭应用程序或旋转屏幕时自动执行窗口过渡和动画。

每个活动都有一个用于在屏幕上显示其内容的窗口。在活动上调用setContentView时,它会将该视图附加到活动的默认窗口。默认窗口填充屏幕,以便您的活动窗口隐藏任何其他活动 - WindowManager将显示顶部的任何窗口。所以通常你不需要担心窗口 - 你只需要创建一个活动,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"/>

答案 1 :(得分:4)

对于android api版本&gt; 23,android.permission.SYSTEM_ALERT_WINDOW需要请求运行时。此外,在{apid 26}中不推荐使用TYPE_SYSTEM_ERROR和一些类型。这就是方法

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

答案 2 :(得分:2)

窗口管理器组织屏幕并处理应该分层的位置和方式。

这是一个漂浮的浮动对象的开源示例。 Floating Object Example