reference to : http://blog.csdn.net/luojiusan520/article/details/47696891
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,