我发现PackageManager类的getPackageInfo()方法有一些奇怪的行为。
我有一个应用程序小部件,它依赖于要安装的特定程序包。因此,在onUpdate()方法中,我测试此软件包是否已安装:
public boolean isAppInstalled(String uri) {
PackageManager pm = context.getPackageManager();
boolean installed = false;
int flags = PackageManager.GET_ACTIVITIES;
try {
pm.getPackageInfo(uri, flags);
installed = true;
} catch (PackageManager.NameNotFoundException e) {
installed = false;
}
return installed;
}
因此,在大多数情况下,在调用onUpdate()方法时,此方法工作正常。
但是,我发现在Android 4.03中,当重新启动设备时,即在启动时,很明显,小部件的onUpdate()方法似乎被“提早”调用,从而错误地抛出NameNotFoundException。再次调用小部件的onUpdate方法时(半小时后),它会根据是否安装了软件包正确引发或不引发异常。
这仅在Android 4.03上发生(同工测试Honeycomb),但2.2和2.3可以正常工作。
有什么建议么?
任何解决方法?
最佳答案
仅在PackageManager完成扫描后,安装的应用程序列表才有效。内部安装的应用程序显示很快(可能在您没有时间了解它们之间的差异之前),但是外部安装的应用程序依赖于已安装的SD卡,这在某些平台上可能需要很长时间。
不幸的是,PackageManger似乎没有任何有用的事件或属性来告诉您何时可能完成,因此您只能依靠替代项,例如何时安装SD卡或何时完成媒体扫描器服务。这仅比启动后的任意延迟好一点,但这是我到目前为止找到的最佳答案。