// 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 状态管理最佳实践!
这些状态管理有什么作用可参考上面👆🏻文章。
下面解释一下进制转换的使用,分享给大家学习学习,注释很详细,认真理解就可顺利消化。
学前教育:位运算知识
按位与(&):当两个对应位的值都为1,则结果为1,否则为0。
0001 & 0100 = 0000
按位或(|):当两个对应位的值都只要有一位是1,则结果为1。
0001|0100 = 0101
取反(~):将一个数按位取反。
~0001 = 1110
java
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
}
}
kotlin
class 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
}
}