Android getPackageInfo()在设备启动时调用时引发异常,但不是稍后?

Android getPackageInfo()在设备启动时调用时引发异常,但不是稍后?,android,widget,package,Android,Widget,Package,我发现PackageManager类的getPackageInfo()方法有一些奇怪的行为 我有一个应用程序小部件,它依赖于要安装的特定软件包。因此,在onUpdate()方法中,我测试是否安装了此包: public boolean isAppInstalled(String uri) { PackageManager pm = context.getPackageManager(); boolean installed = false; int flags = Pack

我发现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,也就是说,在引导时,widgets onUpdate()方法显然被调用为“早期”。当再次调用widgets onUpdate方法时(半小时后),它会正确抛出或不抛出异常,这取决于包是否已安装。 这只发生在Android 4.03上(没有测试蜂巢),但2.2和2.3运行良好

有什么建议吗?
任何解决方法?

只有在PackageManager完成扫描后,已安装应用的列表才有效。内部安装的应用程序看起来相当快(可能在你有时间了解差异之前),但外部安装的应用程序依赖于正在安装的SD卡,这在某些平台上可能需要很长时间

不幸的是,PackageManger似乎没有任何有用的事件或属性可以告诉您何时可以完成此操作,因此您只能依赖于代理,例如SD卡何时安装或介质扫描仪服务何时完成。这只比开机后的任意延迟稍微好一点,但这是迄今为止我找到的最好答案