在Android系統(tǒng)中滨攻,無論是普通的Activity窗口糯俗,還是特殊的輸入法窗口和壁紙窗口顶霞,它們都是被WindowManagerService服務(wù)組織在一個(gè)窗口堆棧中的肄程,其中锣吼,Z軸位置較大的窗口排列在Z軸位置較小的窗口的上面。那么Z軸順序如何決定蓝厌?其實(shí)是WindowManager.LayoutParams構(gòu)造函數(shù)中有個(gè)type玄叠,即窗口的類型決定了它在Z軸的高度。下面列舉了一些常用的類型:
public static final int TYPE_BASE_APPLICATION = 1;
public static final int TYPE_APPLICATION = 2;
public static final int TYPE_APPLICATION_STARTING = 3;
public static final int FIRST_SUB_WINDOW = 1000;
public static final int TYPE_APPLICATION_PANEL = FIRST_SUB_WINDOW;
public static final int TYPE_APPLICATION_MEDIA = FIRST_SUB_WINDOW + 1;
public static final int TYPE_APPLICATION_SUB_PANEL = FIRST_SUB_WINDOW + 2;
public static final int FIRST_SYSTEM_WINDOW = 2000;
public static final int TYPE_STATUS_BAR = FIRST_SYSTEM_WINDOW;
public static final int TYPE_SEARCH_BAR = FIRST_SYSTEM_WINDOW+1;
public static final int TYPE_PHONE = FIRST_SYSTEM_WINDOW+2;
其中199拓提,都是應(yīng)用內(nèi)窗口读恃;10001999都是子窗口;2000開始都是系統(tǒng)級(jí)窗口代态。
應(yīng)用內(nèi)窗口寺惫,顧名思義,應(yīng)用在應(yīng)用內(nèi)部蹦疑,會(huì)跟隨創(chuàng)建其的activity隱藏而隱藏西雀,包括退入后臺(tái),例如Dialog就是用的TYPE_APPLICATION歉摧;
子窗口艇肴,是附著在View之上的窗口,必須有父View判莉,且父View已經(jīng)顯示豆挽,例如PopupWindow用的就是TYPE_APPLICATION_PANEL;
系統(tǒng)級(jí)窗口,需要有 android:system_alert_window這個(gè)權(quán)限才能顯示券盅,和上面兩種窗口不一樣帮哈,不會(huì)隨著activity的消失而消失。但是如果要在app進(jìn)入后臺(tái)后依然顯示锰镀,很多ROM需要用戶手動(dòng)打開懸浮窗權(quán)限娘侍。
http://blog.csdn.net/april_12345/article/details/52933316
http://blog.csdn.net/Luoshengyang/article/details/8570428