Android中getWindow().setFlags的flags与mask参数作用是什么
安卓Window.setFlags方法flags与mask参数详解
参数核心含义
setFlags方法本质是对Window的布局参数标记位做批量修改,底层通过位运算实现,两个参数都为int类型的位标记集合:
- flags参数:你想要最终设置的目标标记位集合。所有你希望生效的窗口属性标记(比如
FLAG_FULLSCREEN、FLAG_KEEP_SCREEN_ON等)都可以通过按位或(|)拼接后放到这个参数里。 - mask参数:修改操作的作用范围标记位集合。它用来指定哪些标记位需要被修改,不在mask范围内的标记位会保持原有状态,完全不受本次调用影响。
二者的作用与运算逻辑
底层实际修改标记位的逻辑对应这行位运算:
windowAttributes.flags = (windowAttributes.flags & ~mask) | (flags & mask);
拆解逻辑:
- 先把原有标记位中属于mask范围内的位全部清零:
(windowAttributes.flags & ~mask) - 再把flags参数里属于mask范围内的位赋值过去:
(flags & mask) - 两部分合并就是修改后的最终标记位。
回到你提到的隐藏状态栏的代码示例:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
这个调用里flags和mask传了同一个值,意思就是:仅修改FLAG_FULLSCREEN这一个标记位,将其设置为生效状态,其他所有窗口标记位保持不变。
如果要同时设置全屏和屏幕常亮两个属性,可以这么写:
int targetFlags = WindowManager.LayoutParams.FLAG_FULLSCREEN | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON; getWindow().setFlags(targetFlags, targetFlags);
如果要取消全屏,不修改其他属性,可以这么写:
getWindow().setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
这里mask指定仅修改全屏标记位,flags对应位的值为0,因此会把全屏标记位清零。
内容的提问来源于stack exchange,提问作者MD Jahid Hasan
相关产品推荐
相关产品推荐

