PackageManager.getInstalledPackages之flags淺談

我們知道,要獲取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嗎?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容