Androidのドキュメントでわかるように、ユーザーを別のアプリに送信するときに暗黙のインテントを構築しようとすると、ActivityNotFoundExceptionを回避するための2つのアプローチがあります。
最初の1つ :
Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
PackageManager packageManager = getPackageManager();
List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
PackageManager.MATCH_DEFAULT_ONLY);
boolean isIntentSafe = activities.size() > 0;
二つ目 :
Intent chooser = Intent.createChooser(intent, title);
if (intent.resolveActivity(getPackageManager()) != null) {
}
今、私の疑問は、何が違うのか、そしてどれを使うべきかということです。
何をしたいかによります。
'ActivityNotFoundException'を防止したいだけの場合は、どちらの方法でも機能します。どちらも「最高」ではありません。彼らは基本的に同じことをします。 Activity
を処理できるIntent
が少なくとも1つあるかどうかを知りたいとします。
さもないと:
queryIntentActivities()
は、Intent
を処理できるすべてのアクティビティのリストを返します。resolveActivity()
は、Activity
を処理できる「最良の」Intent
を返します。したがって、Intent
を処理できるすべてのアクティビティを知りたい場合は、queryIntentActivities()
を使用し、Androidが何であるかを知りたい場合は、 「最良の」Activity
の場合、resolveActivity()
を使用します。
ドキュメントから
指定されたインテントに対して実行できるすべてのアクティビティを取得します。
特定のインテントに対して実行する最適なアクションを決定します。これは、クラスが明示的に指定されていない場合にIntent.resolveActivity(PackageManager)
がアクティビティを見つける方法です。
注:暗黙のインテント(明示的なComponentNameが指定されていない)を使用する場合は、_MATCH_DEFAULT_ONLY
_のみのフラグを設定するかどうかを必ず検討してください。 Context.startActivity(Intent)
およびIntent.resolveActivity(PackageManager)
と同じ方法でアクティビティを解決するには、これを行う必要があります。
要するに、queryIntentActivities
は指定されたList
を処理できるすべての利用可能なResolveInfo
のIntent
を返し、対照的にresolveActivity
は単一の最良のものを返しますResolveInfo
に適しています。
したがって、1つを使用してchooserを表示し、もう1つを使用してアプリを直接起動できます。
詳細については、公式文書をお読みください。