Android中Window

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);

參考-1

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章