Window的屬性
Window的屬性,常用的選項:
FLAG_NOT_FOCUSABLE
Window不需要獲取焦點,也不需要接收各種輸入事件(收不到Back鍵的事件),此標記會同時啓用FLAG_NOT_TOUCH_MODEAL,最終事件會直接傳遞給下層的具有焦點的Window。
FLAG_NOT_TOUCH_MODEAL
收不到觸屏事件,不會攔截其他Window的單擊事件,一般情況下都需要開啓
FLAG_SHOW_WHEN_LOCKED
可讓Window顯示在鎖屏的界面上
版本變動
在Android衆多版本的迭代中,其實懸浮窗也有比較多的變化,所以我們在使用中還要針對情況來進行相應的適配。在5.1之前,大多數手機系統裏只有聲明瞭<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>權限有就可以在app中彈出懸浮窗,除了國內部分廠商手機如:小米、魅族等定製系統中處理了懸浮窗權限要開關。我們日常開發中,比較常用到的類型有:
WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY
沒有實體,不會響應事件,無法進行交互,但可懸浮在鎖屏面板
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
可以接收事件
WindowManager.LayoutParams.TYPE_TOAST
在4.4以下無法接收事件,在4.4到7.0以下可以不加權限聲明也能彈出懸浮窗在應用之上,在7.0及以上系統填補了不加權限聲明的漏洞,在8.0中不能常顯示,像正常Toast一樣有顯示的時間限制
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
8.0上指定開發者使用懸浮窗唯一的類型,其它類型都會報崩潰
PS
想要在應用內顯示在所以Activity之上設置type=TYPE_APPLICATION
如果傳入的Context(必須是Activity) 不是當前Active的Activity也是不能正常show出來的。現在比較好的方案是在基類Activity中處理需要展示同一業務的Window
demo
mWm = (WindowManager) activity.getSystemService(Context.WINDOW_SERVICE);
Context context = activity;
mWindowView = View.inflate(context, R.layout.xxx, null);
WindowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_APPLICATION;
params.format = PixelFormat.TRANSLUCENT;
mWm.addView(mWindowView, params);