我們知道,要獲取android手機(jī)上的已安裝應(yīng)用列表,可以通過(guò)調(diào)用PackageManager.getInstalledPackages接口來(lái)實(shí)現(xiàn)(不考慮沒(méi)有讀已安裝列表權(quán)限的case),List<PackageInfo> getInstalledPackages(@PackageInfoFlags int flags),可以看到這個(gè)接口只有一個(gè)參數(shù):flags。相信很多同學(xué)跟我一樣,平時(shí)為了省事會(huì)習(xí)慣性地傳入0,但你知道這個(gè)參數(shù)的用途嗎?傳0會(huì)不會(huì)有問(wèn)題?
在作者的項(xiàng)目中,需要用到PackageInfo里的activities和services信息,但是發(fā)現(xiàn)PackageManager.getInstalledPackages(0)返回的PackageInfo里的activities和services居然為空。天??!這個(gè)應(yīng)用里明明有activity和service啊,怎么會(huì)沒(méi)取到呢?系統(tǒng)接口有bug嗎?要弄清楚原因,還是需要打開(kāi)萬(wàn)能的源碼一探究竟,經(jīng)過(guò)一系列的調(diào)用后,最終會(huì)調(diào)到PackageManagerService.java里的PackageInfo generatePackageInfo(PackageParser.Package p, int gids[], int flags, long firstInstallTime, long lastUpdateTime, SetgrantedPermissions, PackageUserState state, int userId)這個(gè)方法,關(guān)鍵截圖如下:

可以看到,只有傳入了對(duì)應(yīng)的flag,才會(huì)幫你獲取相應(yīng)的信息,這樣設(shè)計(jì)也很好理解,畢竟大多數(shù)情況都用不到這些信息,這樣設(shè)計(jì)可以提高API的執(zhí)行效率?;氐街暗腸ase,要獲取activities和services信息,很顯然flag不能再傳0了,正確的姿勢(shì)是PackageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES)。你還敢隨便給flags傳0嗎?