web-dev-qa-db-ja.com

queryIntentActivities()とresolveActivity()の違いは何ですか?インテントの既存のアプリについて知るための最良のアプローチはどれですか?

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) {

}

今、私の疑問は、何が違うのか、そしてどれを使うべきかということです。

7
Ajay Chauhan

何をしたいかによります。

'ActivityNotFoundException'を防止したいだけの場合は、どちらの方法でも機能します。どちらも「最高」ではありません。彼らは基本的に同じことをします。 Activityを処理できるIntentが少なくとも1つあるかどうかを知りたいとします。

さもないと:

  • queryIntentActivities()は、Intentを処理できるすべてのアクティビティのリストを返します。
  • resolveActivity()は、Activityを処理できる「最良の」Intentを返します。

したがって、Intentを処理できるすべてのアクティビティを知りたい場合は、queryIntentActivities()を使用し、Androidが何であるかを知りたい場合は、 「最良の」Activityの場合、resolveActivity()を使用します。

8
David Wasser

ドキュメントから

指定されたインテントに対して実行できるすべてのアクティビティを取得します。

特定のインテントに対して実行する最適なアクションを決定します。これは、クラスが明示的に指定されていない場合にIntent.resolveActivity(PackageManager)がアクティビティを見つける方法です。

注:暗黙のインテント(明示的なComponentNameが指定されていない)を使用する場合は、_MATCH_DEFAULT_ONLY_のみのフラグを設定するかどうかを必ず検討してください。 Context.startActivity(Intent)およびIntent.resolveActivity(PackageManager)と同じ方法でアクティビティを解決するには、これを行う必要があります。

1
Nilesh Rathod

要するに、queryIntentActivitiesは指定されたListを処理できるすべての利用可能なResolveInfoIntentを返し、対照的にresolveActivityは単一の最良のものを返しますResolveInfoに適しています。

したがって、1つを使用してchooserを表示し、もう1つを使用してアプリを直接起動できます。

詳細については、公式文書をお読みください。

0
waqaslam