FLAG_DISMISS_KEYGUARD & FLAG_SHOW_WHEN_LOCKED

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

 

posted on 2016-05-05 17:40  Matrixin  阅读(5719)  评论(0编辑  收藏  举报

导航