奇妙的16进制状态管理-创新互联
// View.class源码
static final int PFLAG3_VIEW_IS_ANIMATING_TRANSFORM = 0x1;
static final int PFLAG3_VIEW_IS_ANIMATING_ALPHA = 0x2;
static final int PFLAG3_IS_LAID_OUT = 0x4;
static final int PFLAG3_MEASURE_NEEDED_BEFORE_LAYOUT = 0x8;
static final int PFLAG3_CALLED_SUPER = 0x10;
static final int PFLAG3_APPLYING_INSETS = 0x20;
static final int PFLAG3_FITTING_SYSTEM_WINDOWS = 0x40;
static final int PFLAG3_NESTED_SCROLLING_ENABLED = 0x80;
static final int PFLAG3_SCROLL_INDICATOR_TOP = 0x0100;
...
// intent
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TASK)
以前看到这种源码Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
根本不懂啥意思,为什么或
一下就可以了。
亦或者Android Intent.createChooser()函数这个permFlags
对象为什么要判断!=0
。
public static final int FLAG_GRANT_READ_URI_PERMISSION = 0x00000001;
public static final int FLAG_GRANT_WRITE_URI_PERMISSION = 0x00000002;
public static final int FLAG_FROM_BACKGROUND = 0x00000004;
public static final int FLAG_DEBUG_LOG_RESOLUTION = 0x00000008;
public static final int FLAG_EXCLUDE_STOPPED_PACKAGES = 0x00000010;
...
public static Intent createChooser(Intent target, CharSequence title, IntentSender sender) {...
// Migrate any clip data and flags from target.
int permFlags = target.getFlags() & (FLAG_GRANT_READ_URI_PERMISSION
| FLAG_GRANT_WRITE_URI_PERMISSION | FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| FLAG_GRANT_PREFIX_URI_PERMISSION);
if (permFlags != 0) {...
}
}
直到看到了🔗Android16进制妙用这篇文章,恍然大悟,原来进制
的使用可以这么奇妙!
另参考:
🔗就算不去火星种土豆,也请务必掌握的 Android 状态管理最佳实践!
🔗为什么源码中都使用16进制进行状态管理?
这些状态管理有什么作用可参考上面👆🏻文章。
下面解释一下进制转换的使用,分享给大家学习学习,注释很详细,认真理解就可顺利消化。
按位与(&):当两个对应位的值都为1,则结果为1,否则为0。0001 & 0100 = 0000
按位或(|):当两个对应位的值都只要有一位是1,则结果为1。0001|0100 = 0101
取反(~):将一个数按位取反。~0001 = 1110
public class BinaryConvert {int weather = 0;//0000
int snow = 1;//0x1 0001
int rain = 1<< 1;//0x2 0010
int sun = 1<< 2;//0x4 0100
int cloud = 1<< 3;//0x8 1000
private void convert() {//以下代码逻辑按顺序理解
//初始赋值为下雪状态
weather |= snow;
//0000 | 0001 = 0001
//下雪 转为 雨+雪
weather = snow | rain;//标准格式,例如增加rain状态,snow | rain 的`或`
//0011 = 0001 | 0010
//雨+雪 转为 多云+雨+雪
weather = snow | rain | cloud;
//1011 = 0001 | 0010 | 1000
//多云+雨+雪 转为 雨+雪
weather = weather & ~cloud;//标准格式,例如移除var2状态可以使用 var1 & ~var2 的先`非`后`与`
//~1000 为 0111
//0011 = 1011 | 0111
//是否下雨,此时状态是雨夹雪
boolean isRain = (weather & rain) != 0;//true
//0011 & 0010 = 0010
//是否下雨,此时状态是雨夹雪
boolean isSun = (weather & sun) != 0;//false
//0011 & 0100 = 0000
}
}
kotlinclass BinaryConvert
{var weather = 0x0
val snow = 0x1
val rain = 0x2
val sun = 0x4
val cloud = 0x8
fun getWeather()
{//赋值为下雪
weather = weather or snow
//0000 | 0001 = 0001
//雨+雪
weather = snow or rain
// 0011 = 0001 | 0010
//雨+雪 转为 多云+雨+雪
weather = snow or rain or cloud
// 1011 = 0001 | 0010 | 1000
//多云+雨+雪 转为 雨+雪
weather = weather and cloud.inv()
//~1000 为 0111
//0011 = 1011 | 0111
//是否下雨,此时状态是雨夹雪
val isRain = weather and rain != 0 //true
//0011 & 0010 = 0010
//是否下雨,此时状态是雨夹雪
val isSun = weather and sun != 0 //false
//0011 & 0100 = 0000
}
}
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧
网站标题:奇妙的16进制状态管理-创新互联
本文来源:http://hbruida.cn/article/dcgood.html