更快或更清晰的方式来确定一个包是否安装在 Android 上

Ric*_*ich 5 java android

我知道我可以NameNotFoundException从调用中捕获PackageManager.getPackageInfo或循环遍历PackageInfo返回的列表PackageManager.getInstalledPackages以了解是否安装了特定的软件包,但这两种方法看起来要么冗长乏味,要么很难看。在我的个人手机上,我安装了 300 多个软件包,所以我不想每次需要检查时都必须执行该操作。捕获异常作为执行应用程序逻辑的一种方式只会让我觉得整个人都错了。我是否在某处缺少 isPackageInstalled 方法,或者我是否只需要使用上述技术之一自己实现它?如果是后者,哪个会被认为是更快、资源密集度更低的选择?

Jas*_*ley 0

恕我直言,处理 NameNotFoundExcepetion 不应让您感到“完全错误”。根据文档,如果该包自 api 级别 1 起不存在,则会抛出此异常。使用 try/catch 语句与使用 if/then 语句测试 null 值非常相似。

在这种情况下,不应将其视为解决方法或黑客攻击,因为您正在使用异常的记录和预期返回值来确定包是否存在。

我认为此方法比迭代 getInstalledPackages() 返回的列表更快。但是,我不知道 android 在返回 NameNotFoundException 之前采取了哪些步骤。这将是一个有趣的基准测试。

我不知道有任何其他实用方法来测试已安装的软件包。

  • 强烈反对。抛出异常的操作不仅昂贵且缓慢,而且很丑陋并且不能表达我的意图。您应该阅读以下页面上的一些讨论:http://stackoverflow.com/questions/567579/how-expective-are-exceptions。就循环而言,即使大约 300 次迭代就 CPU 周期而言也不是那么昂贵,昂贵的部分是 getInstalledPackages 调用的内部。 (3认同)