reference to :
getinstalledpackages()的方法获取到安装应用信息 ,他接收一个int flags的值,然后在网上查询资料全是 将Int 值 设置为0 即比如
PackageManager manager = context.getPackageManager();// 得到包的管理者List<PackageInfo> installedPackages = manager.getInstalledPackages(0);
本想查看源代码看看0是什么参数。结果就出现了问题,参数如下
public static final int GET_ACTIVITIES = 0x00000001;
public static final int GET_RECEIVERS = 0x00000002; public static final int GET_SERVICES = 0x00000004; public static final int GET_PROVIDERS = 0x00000008; ...0x00000010; 0x00000020; 0x00000040; 0x00000040; 0x00000080; 0x00000100; 0x00000200; 0x00000400; 0x00000800; 0x00001000; 0x00002000; 0x00004000;每个flag参数的意思,见名思意是用来获取相应的包信息,全部是16进制表示的int的数。但是疑惑没有0,网上查询没有相应的信息,于此思考许久留下笔记留下印象。
通过观察源代码帮组我分析的信息如下:
(1)观察源代码注释flags Additional option flags. Use any combination of ....flag
方法前后文英文大意:额外信息通过flag获得,使用flag的任何组合。
看到这条源代码组合(combination )二字其实问题就解决一半了。 意思是可以用来组合 任意的flag ,添加任何flag到参数中;
(2)通过观察其他 参数 既static final int 的值
比如:
public static final int COMPONENT_ENABLED_STATE_ENABLED = 1; public static final int COMPONENT_ENABLED_STATE_DISABLED = 2; public static final int COMPONENT_ENABLED_STATE_DISABLED_USER = 3;
为何都是设置的 10进制的值,,看到这里我想我已经解决了问题,
(3)分析方法参数的值,换算为2进制;
依次为:00000001 00000010 00000100 00001000 ................... 这样设置的好处就是 任意组合的特征码都是唯一的。不会参生混淆
比如 16+8 = 24 24只能由参数中此两个数而得到。
32+2=34 同理
64 +8=72 同理
如果flag采用 十进制1 ,2,3,4,5,6,7的方式进行 处理的话 当方法中数为 特定的数时候可能出现不同的组合,所以就不能使用此方式,因为计算机是不会智能处理人的需求的。
得出我的结论如下:
参数0 是 表示不接受任何flag信息,当然也能够返回得到一些基本的包信息!,但是如 PERMISSIONS ,RECEIVERS 等等就返回不了,如果flag值不匹配 而方法中强行获取相对应的值,返回值为Null,已经做过测试
延伸: PackageManager.GET_ACTIVITIES+ PackageManager.GET_RECEIVERS 等于 3; 参数中填入3则得到这两个的flag对应的信息。
注意点 :PackageManager.GET_ACTIVITIES| PackageManager.GET_ACTIVITIES 和上为一样的效果。 因为相或的话 同位只要有一个1则为1,