android - getPackageInfo() 在设备启动时调用时抛出异常,但以后不会?

标签 android widget package

我发现 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() 方法被调用为“早期”。当再次调用小部件的 onUpdate 方法时(半小时后),它会正确抛出或不抛出异常,具体取决于是否安装了包。 这只发生在 Android 4.03 上(没有测试 Honeycomb),但 2.2 和 2.3 工作正常。

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

最佳答案

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

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

关于android - getPackageInfo() 在设备启动时调用时抛出异常,但以后不会?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10903893/

相关文章:

android - 获取两个位置之间的距离,例如 Google Directions 中的 http 请求

macos - “Undefined is not a function”在Dashcode中播放声音

python - Anaconda - 如何更新另一个环境的所有包?

android - 如何构建 Jetpack Compose 项目?

android - Android NotePad 教程是否与 Android 版本 2 兼容?

android - 如何以编程方式删除 ImageButton 的填充?

Android Widget 没有响应

斯卡拉 SBT : standalone jar

c - 使用 C 代码构建 R 包,缺少 dll

Android - 将自定义 View 添加到 ListView(以在侧边菜单中获得暗淡效果)