В чем разница между queryIntentActivities () и resolActivity (). Какой из подходов лучше всего знать о существующих приложениях? - PullRequest
0 голосов
/ 10 октября 2018

Как я вижу в документации Android при попытке создать неявные намерения при отправке пользователя в другое приложение.Это два подхода, позволяющие избежать исключений ActivityNotFoundException.

Первый:

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

}

Теперь я сомневаюсь, в чем различие и какой из них следуетя использую?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Короче говоря, queryIntentActivities возвращает List из всех доступных ResolveInfo, которые могут обработать ваши данные Intent, и, напротив, resolveActivity возвращает единственный наиболее подходящий ResolveInfo.

Следовательноодин может использоваться для отображения chooser , а другой - для непосредственного запуска приложения.

Для получения дополнительной информации ознакомьтесь с их официальными документами.

0 голосов
/ 10 октября 2018

Зависит от того, что вы хотите сделать.

Если вы просто хотите предотвратить исключение ActivityNotFoundException, любой из методов будет работать.Ни один не "лучший".Они делают в основном то же самое.Вы хотите знать, есть ли хотя бы 1 Activity, который может обработать вашу Intent.

В противном случае:

  • queryIntentActivities() возвращает список всех операций, которые могут обрабатыватьIntent.
  • resolveActivity() возвращает «лучшее» Activity, которое может обработать Intent

Поэтому, если вы хотите знать все действия, которые могут обрабатывать ваши Intent, вы бы использовали queryIntentActivities(), и если вы хотите знать, что Android считает «лучшим» Activity, то вы бы использовали resolveActivity().

0 голосов
/ 10 октября 2018

Из документов

Получить все действия, которые могут быть выполнены для данного намерения.

Определите наилучшее действие, которое нужно выполнить для данного Намерения.Вот как Intent.resolveActivity(PackageManager) находит действие, если класс не был указан явно.

Примечание: при использовании неявного Намерения (без явного указания ComponentName), обязательно подумайте, стоит ли устанавливать флаг MATCH_DEFAULT_ONLY only.Вы должны сделать это для разрешения действия так же, как Context.startActivity(Intent) и Intent.resolveActivity(PackageManager).

...