使用PackageManager.getInstalledPackages()方法时,我遇到了一个非常奇怪的情况。我第一次启动活动时,会获得所有已安装软件包的有效列表。但是第二次启动我的活动时,我得到一个空列表......可能导致这种情况的原因是什么?
我正在使用此代码获取列表: 列出pkgList = getPackageManager()。getInstalledPackages(PackageManager.GET_ACTIVITIES);
我正在构建1.6 SDK,兼容1.5 +
提前感谢任何建议/帮助......我对原因感到困惑,不能想到我做错了什么。
答案 0 :(得分:3)
由于某种原因,可能需要在主应用程序线程上调用 PackageManager
。我没有尝试使用AsyncTask
。
更新2018-03-26 :PackageManager
通常可以在后台线程上调用,特别是getInstalledPackages()
。
答案 1 :(得分:1)
你得到一个空列表,因为PackageManager死了,因为用于返回已安装应用程序列表的IPC缓冲区比它的1MB缓冲区大小(从4.4开始)大。
从API 15开始,相同的行为会引发TransactionTooLargeException
。在< 15 API上只返回一个空列表,有时在logcats中可以看到一个小错误。
getInstalledPackages()
不需要在UI线程上执行。这似乎是这样,但这只是偶然的。如果只在主线程上执行它,则会产生副作用,它会阻止同时调用可能会填满进程范围内的共享IPC缓冲区。