Android WindowManagerはシステムサービスであり、Windowsが表示されているWindowsのZオーダー付きリストと画面上のレイアウトの管理を担当します。とりわけ、アプリを開設または閉じたり、画面を回転させたりするときに、ウィンドウの遷移とアニメーションを自動的に実行します。
すべてのアクティビティには、画面にコンテンツを表示するために使用されるウィンドウがあります。アクティビティでsetContentViewを呼び出すと、アクティビティのデフォルトウィンドウにそのビューを添付します。デフォルトのウィンドウが画面に入力されるため、アクティビティのウィンドウが他のアクティビティを隠すようになります。ウィンドウマネージャーには、上部にあるウィンドウが表示されます。したがって、通常、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"/>