NameNotFoundException
特定のパッケージがインストールされているかどうかを知るために、 への呼び出しから をキャッチするか、によって返されPackageManager.getPackageInfo
たリストをループ処理できることはわかっていますが、これらはどちらも長々としたものか見苦しいものに見えます。私個人の携帯電話には 300 個以上のパッケージがインストールされているため、チェックする必要があるたびにその操作を行う必要はありません。そして、アプリケーション ロジックを実行する手段として例外をキャッチすることは、私を完全に間違っていると感じさせます。isPackageInstalled メソッドがどこかにありませんか、それとも上記の手法のいずれかを使用して自分で実装する必要がありますか? 後者の場合、どちらがより高速でリソース消費の少ないオプションと見なされますか?PackageInfo
PackageManager.getInstalledPackages
4 に答える
PackageManager.getInstalledPackages()
を返すのでList
、手動でループする必要はありません。List.contains()
またはを使用List.containsAll()
して、1 行のコードでタスクを実行できます。もちろん、どちらのメソッドにもループ自体が含まれている可能性が高いため、これによって効率が変わることはありません。
API の使用に本当にバグがある場合は、次のようなハックを調べることができます。
PM リストを取得する Bash シェル式 Java ランタイム式 Java パイプとバッファとストリーム Java NIO Java grep
したがって、bash 式は次のようになります。
pm リスト パッケージ -f | sed 's/^package.//' | awk -F"=" ' { print $2" "$1 } ' | 選別
そして、より高速になる可能性のある方法で「pmリスト」からのstdoutを処理するための参照のリスト...
私はいくつかのベンチマークを作成し、インストールされたパッケージをフェッチしてそれらをループするいくつかの異なる方法と、例外をキャッチすることをテストしました。これが私の結果です
PackageManager.getPackageInfo を呼び出して NameNotFoundException をキャッチするには、要求されたパッケージがインストールされているかどうかにかかわらず、すべてのケースで 1 ~ 4 ミリ秒かかりました。これが、アプリの特定の実行に対する PackageManager への最初の呼び出しである場合も含めるようにしました。フレームワークがアプリの起動ごとにこの情報をキャッシュする場合に備えて、後続の呼び出しとして。
同様に、PackageManger.getPackageInfo の呼び出しには、すべてのケースで 1 ~ 1.5 秒かかりました。
getPackageInfo を呼び出して例外をキャッチし、パッケージがインストールされていないかどうかを判断する方法は、はるかに高速なチェック方法です。