Android WindowManager はシステム サービスであり、z 順のウィンドウ リスト、表示されるウィンドウ、画面上でのレイアウト方法を管理します。特に、アプリの開閉や画面の回転時に、ウィンドウの遷移とアニメーションを自動的に実行します。
すべてのアクティビティには、そのコンテンツを画面に表示するために使用される Window があります。アクティビティで 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"/>