getWindow().addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD): 這一個標志的意思是去掉鎖屏界面,但這對安全鎖(圖案或者密碼鎖屏界面)是無效的。在沒有設置安全鎖的時候,我們需要上滑一下(可能是其它方式)退出鎖屏界面,才能進入桌面,這個標志就是去掉這一界面,使得比如網易雲音樂這類在鎖屏界面播放的時候,只需要直接解鎖雲音樂的鎖屏即可,不需要再上滑解除系統本身的鎖屏。
可以認為鎖屏界面是一個窗口視圖,解鎖圖案界面是另一個窗口視圖,FLAG_DISMISS_KEYGUARD只能控制去除鎖屏界面窗口。
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED): 這一個標志的意思是使得窗口浮在鎖屏界面之上。這給像電話這類應用一個快捷的不需要解鎖的就能使用的便利。
flag & | ~的使用方法:
public static final int FLAG_A = 0x4; public static final int FLAG_B = 0x8; private int flag = 0;
添加標志,並且不同標志是疊加到這一個變量上的:
flag |= FLAG_A;
flag |= FLAG_B;
判斷是否添加了該標志:
boolean hasA = (0 != (flag & FLAG_A)); boolean hasB = (0 != (flag & FLAG_B));
刪除某一已添加的標志:
if(hasA){
flag &= ~FLAG_A;
}
if(hasB){
flag &= ~FLAG_B;
}
FLAG_A和FLAG_B的設置也是有講究的,& | ~是按位操作符,所以必須FLAG必須是按位不重復的。比如FLAG_A = 1; FLAG_B = 2是可以的,FLAG_C = 3就同時包括了FLAG_A和FLAG_B,所以當flag = FLAG_C時,hasA和hasB就同時為true了。
通常我們如下約定FLAG標志:
public static final int SUPPORT_DELETE = 1 << 0; public static final int SUPPORT_ROTATE = 1 << 1; public static final int SUPPORT_SHARE = 1 << 2; public static final int SUPPORT_CROP = 1 << 3; public static final int SUPPORT_SHOW_ON_MAP = 1 << 4; public static final int SUPPORT_SETAS = 1 << 5; public static final int SUPPORT_FULL_IMAGE = 1 << 6; public static final int SUPPORT_ALL = 0xffffffff;
這樣就絕對不會有重復了。
public class LogicalTest{ public static final int FLAG_A = 0x00400000; public static final int FLAG_B = 0x00080000; private static int flag = 0; public static void main(String[] args){ flag |= FLAG_A; System.out.println("--- flag = " + Integer.toHexString(flag)+ ", hasA() = " + hasA() + ", hasB() = " + hasB()); flag |= FLAG_B; System.out.println("--- flag = " + Integer.toHexString(flag) + ", hasA() = " + hasA() + ", hasB() = " + hasB()); if(hasA())flag &= ~FLAG_A; System.out.println("--- flag = " + Integer.toHexString(flag) + ", hasA() = " + hasA() + ", hasB() = " + hasB()); if(hasB())flag &= ~FLAG_B; System.out.println("--- flag = " + Integer.toHexString(flag) + ", hasA() = " + hasA() + ", hasB() = " + hasB()); } public static boolean hasA(){ return (0 != (flag & FLAG_A)); } public static boolean hasB(){ return (0 != (flag & FLAG_B)); } }
運行結果:
--- flag = 400000, hasA() = true, hasB() = false --- flag = 480000, hasA() = true, hasB() = true --- flag = 80000, hasA() = false, hasB() = true --- flag = 0, hasA() = false, hasB() = false
