奇妙的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

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
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值