【问题标题】:getPackageInfo() throws exception when called when devices starts, but not later?设备启动时调用getPackageInfo()会引发异常,但以后不会?
【发布时间】:2012-06-05 19:47:05
【问题描述】:

我发现 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 可以正常工作。

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

【问题讨论】:

    标签: android widget package


    【解决方案1】:

    已安装应用程序列表仅在 PackageManager 完成扫描后才有效。内部安装的应用程序出现得很快(可能在您有时间知道区别之前),但外部安装的应用程序依赖于安装的 SD 卡,这在某些平台上可能需要很长时间。

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

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 2012-10-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多