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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


本文名称:奇妙的16进制状态管理-创新互联
本文链接:http://scyanting.com/article/dcgood.html