WindowManagerのaddViewとremoveViewの話
今回はWindowManagerのaddViewとremoveViewについて紹介します。
Androidで画面表示を行う場合基本となるのはActivityですが、Activityを使用しないで画面表示を行いたい場合WindowManagerのaddViewとremoveViewを使用します。
使い方は簡単で下記のように使用します。
//追加
WindowManager wm = (WindowManager)Context.getSystemService(Context.WINDOW_SERVICE);
View view = new View(Context);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
wm.addView(view, params);
//削除
wm.removeView(view);
Viewを追加する際に使用しているWindowManager.LayoutParamsはViewを表示するWindowの情報を設定することが出来ます。
例えばLayoutParams.FLAG_FULLSCREENをLayoutParamsのflagsフィールドに設定するとViewを全画面表示することが出来ます。
このようにActivityを使用しない画面表示で使用するWindowManagerのaddView/removeViewですが、使用するタイミングに注意が必要です。
removeViewのWindow削除処理はAndroid Framework内部で非同期処理になっており実際の削除処理が実行されるタイミングはremoveViewを呼び出したタイミングではありません。
そのため、removeViewを実行したタイミングで削除されないと困るような処理を書いているとタイミングがずれたときバグが発生し困ったことになります。
// 私は実際にバグを引き当て調査するのが大変でした...
WindowManager.LayoutParamsの説明が大分適当ですが今回はここまでにします。
WindowManagerを使用するときはremoveViewのタイミングに気を付けて使用してください。