web-dev-qa-db-ja.com

AndroidのWindowManagerとは何ですか?

私はそれをグーグルで試してみましたが、直接および/または明確な答えはありません。

開発者ウェブサイト の定義も明確ではありません:

ウィンドウマネージャーと通信するためにアプリが使用するインターフェイス。 Context.getSystemService(Context.WINDOW_SERVICE)を使用して、これらのいずれかを取得します。

普通の6年生の英語の誰かがそれが何であるかを説明できますか?

そして、それを使用して、一方から他方に移動しても、いくつかのアクティビティを介して残るフローティングオブジェクトを作成するにはどうすればよいですか?

59
tony9099

Android WindowManagerはシステムサービスであり、zオーダーのウィンドウのリスト、どのウィンドウが表示され、どのように画面上にレイアウトされるかを管理します。アプリを開いたり閉じたり、画面を回転させたりするときに、ウィンドウの切り替えとアニメーションを実行します。

すべてのアクティビティには、画面にコンテンツを表示するために使用されるウィンドウがあります。アクティビティで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"/>
126
simonp

Android api version> 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;
}
5
Phan Van Linh

ウィンドウマネージャは画面を整理し、どこに何を表示し、どのように階層化するかを処理します。

フローティングオブジェクトの素敵なオープンソースの例を次に示します。 浮動オブジェクトの例

2
Pete