我发现了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中,当设备重新启动时,它会错误地抛出NameNotFoundException,也就是说,在启动时,显然小部件onUpdate()方法被调用为“早期”。当再次调用小部件onUpdate方法(半小时后)时,它会正确抛出或不抛出异常,具体取决于是否安装了软件包。 这只发生在Android 4.03上(没有测试Honeycomb),但2.2和2.3工作正常。
有什么建议吗? 任何解决方法?
答案 0 :(得分:1)
安装的应用程序列表仅在PackageManager完成扫描后才有效。内部安装的应用程序看起来很快(可能在您有时间了解其中之前),但外部安装的应用程序依赖于正在安装的SD卡,这在某些平台上可能需要很长时间。
不幸的是,PackageManger似乎没有任何有用的事件或属性可以告诉您何时完成此操作,因此您只能依赖代理,例如安装SD卡或媒体扫描程序服务完成时。这仅比启动后的任意延迟略好,但是到目前为止我找到的最佳答案。