2

使用 PackageManager.getInstalledPackages() 方法时,我遇到了一个非常奇怪的情况。第一次启动我的活动时,我会得到所有已安装软件包的有效列表。但是第二次启动我的活动时,我得到一个空列表......可能是什么原因造成的?

我正在使用此代码获取列表: List pkgList = getPackageManager().getInstalledPackages(PackageManager.GET_ACTIVITIES);

我正在构建与 1.5+ 兼容的 1.6 SDK

提前感谢您的任何建议/帮助......我真的对原因感到困惑,并且想不出我做错了什么。

4

2 回答 2

2

出于某种原因,可能PackageManager需要在主应用程序线程上调用。我没有尝试从AsyncTask.

更新 2018-03-26PackageManager通常可以在后台线程上调用,getInstalledPackages()特别是。

于 2010-08-11T12:14:19.790 回答
1

你得到一个空列表,因为 PackageManager 死了,因为用于返回已安装应用程序列表的 IPC 缓冲区增长大于它的 1MB 缓冲区大小(截至 4.4)。

从 API 15 开始,相同的行为会抛出TransactionTooLargeException. 但是,在 <15 个 API 上,只返回一个空列表,有时在 logcats 中会出现一个小错误。

getInstalledPackages()不需要在 UI 线程上执行。看起来可能是这样,但这只是偶然的。如果只在主线程上执行它,则会产生副作用,即它会阻止可能填满进程范围共享 IPC 缓冲区的同时调用。

于 2014-10-03T01:21:22.513 回答