我发现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卡或何时完成媒体扫描器服务。这仅比启动后的任意延迟好一点,但这是我到目前为止找到的最佳答案。

10-08 13:47