PackageManager.getInstalledPackages之flags浅谈

我们知道,要获取android手机上的已安装应用列表,可以通过调用PackageManager.getInstalledPackages接口来实现(不考虑没有读已安装列表权限的case),List<PackageInfo> getInstalledPackages(@PackageInfoFlags int flags),可以看到这个接口只有一个参数:flags。相信很多同学跟我一样,平时为了省事会习惯性地传入0,但你知道这个参数的用途吗?传0会不会有问题?

在作者的项目中,需要用到PackageInfo里的activities和services信息,但是发现PackageManager.getInstalledPackages(0)返回的PackageInfo里的activities和services居然为空。天啊!这个应用里明明有activity和service啊,怎么会没取到呢?系统接口有bug吗?要弄清楚原因,还是需要打开万能的源码一探究竟,经过一系列的调用后,最终会调到PackageManagerService.java里的PackageInfo generatePackageInfo(PackageParser.Package p, int gids[], int flags, long firstInstallTime, long lastUpdateTime, SetgrantedPermissions, PackageUserState state, int userId)这个方法,关键截图如下:

《PackageManager.getInstalledPackages之flags浅谈》

可以看到,只有传入了对应的flag,才会帮你获取相应的信息,这样设计也很好理解,毕竟大多数情况都用不到这些信息,这样设计可以提高API的执行效率。回到之前的case,要获取activities和services信息,很显然flag不能再传0了,正确的姿势是PackageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES | PackageManager.GET_SERVICES)。你还敢随便给flags传0吗?

    原文作者:GotoWhere
    原文地址: https://www.jianshu.com/p/cb98d56542f8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞