2

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 メソッドが再度呼び出されると (30 分後)、パッケージがインストールされているかどうかに応じて、例外が正しくスローされるか、スローされません。これは Android 4.03 (Honeycomb をテストしていない) でのみ発生しますが、2.2 と 2.3 は正常に動作します。

助言がありますか?回避策はありますか?

4

1 に答える 1

1

インストールされたアプリのリストは、PackageManager がアプリのスキャンを終了した後にのみ有効になります。内部にインストールされたアプリはすぐに表示されますが (おそらく違いを知る前に)、外部にインストールされたアプリはマウントされている SD カードに依存しているため、プラットフォームによっては時間がかかる場合があります。

残念ながら、これがいつ完了するかを示す PackageManger の有用なイベントやプロパティはないようです。そのため、SD カードがマウントされたときやメディア スキャナ サービスが終了したときなどのサロゲートにのみ頼ることができます。これは、起動後の任意の遅延よりもわずかに優れていますが、これまでに見つけた最良の答えです。

于 2013-01-28T10:02:56.173 に答える