我們知道州既,要獲取android手機(jī)上的已安裝應(yīng)用列表,可以通過調(diào)用PackageManager.getInstalledPackages接口來實(shí)現(xiàn)(不考慮沒有讀已安裝列表權(quán)限的case)谜悟,List<PackageInfo> getInstalledPackages(@PackageInfoFlags int flags),可以看到這個接口只有一個參數(shù):flags。相信很多同學(xué)跟我一樣宦搬,平時為了省事會習(xí)慣性地傳入0带饱,但你知道這個參數(shù)的用途嗎毡代?傳0會不會有問題?
在作者的項(xiàng)目中勺疼,需要用到PackageInfo里的activities和services信息教寂,但是發(fā)現(xiàn)PackageManager.getInstalledPackages(0)返回的PackageInfo里的activities和services居然為空。天爸绰酪耕!這個應(yīng)用里明明有activity和service啊,怎么會沒取到呢轨淌?系統(tǒng)接口有bug嗎迂烁?要弄清楚原因,還是需要打開萬能的源碼一探究竟递鹉,經(jīng)過一系列的調(diào)用后盟步,最終會調(diào)到PackageManagerService.java里的PackageInfo generatePackageInfo(PackageParser.Package p, int gids[], int flags, long firstInstallTime, long lastUpdateTime, SetgrantedPermissions, PackageUserState state, int userId)這個方法,關(guān)鍵截圖如下:
可以看到梳虽,只有傳入了對應(yīng)的flag址芯,才會幫你獲取相應(yīng)的信息,這樣設(shè)計也很好理解窜觉,畢竟大多數(shù)情況都用不到這些信息谷炸,這樣設(shè)計可以提高API的執(zhí)行效率≠鞔欤回到之前的case旬陡,要獲取activities和services信息,很顯然flag不能再傳0了语婴,正確的姿勢是PackageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES)描孟。你還敢隨便給flags傳0嗎驶睦?