Что именно делает intent.resolveActivity (getPackageManager ())? - PullRequest
0 голосов
/ 14 апреля 2019

Я просматриваю Руководства для разработчиков Android и обнаружил строку кода, которую я не понимаю.

Это строка кода (находится на 4-й странице учебных пособий для разработчиков Android).

    Intent intent = new Intent(Intent.ACTION_VIEW, webpage);
    if (intent.resolveActivity(getPackageManager()) != null) {
        startActivity(intent);
    }

У меня есть пара вопросов.

1) Intent.ACTION_VIEW документация говорит, что он просто отображает данные для пользователя. Я понимаю, что выбранное приложение будет зависеть от типа отображаемых данных. Например, в этом случае веб-страница анализируется как тип данных URI. Но что за неявное намерение создается здесь? В серверной части я могу думать об Android как о прохождении всех классов в моем телефоне и о том, какой из них имеет фильтр намерений, который может обрабатывать данные, и создании структуры намерений для запуска найденного им класса?

2) Что произойдет, если он найдет несколько классов, которые могут справиться с этим? Он просто выбирает значение по умолчанию или просит пользователя выбрать, в каком приложении он хочет работать? Когда я запустил код на своем телефоне, он просто запустил интернет-приложение Samsung по умолчанию.

3) Это на самом деле мой главный вопрос. Если намерение уже было связано с классом для начала, зачем вообще беспокоиться о intent.resolveActivity(getPackageManager())? Его документация определяет, как он обрабатывает класс, если класс возвращается. Итак, класс возвращается. Но также этот класс, который он возвращает, не «включен» в мой intent ни в одну строку моего кода, что заставляет меня думать, что Intent.ACTION_VIEW каким-то образом уже обработал его для меня.

Это будет скачком, но могу ли я сказать, что Intent.ACTION_VIEW выполняет intent.resolveActivity(getPackageManager()) или другую функцию, которая выполняет аналогичные функции и каким-то образом включает класс, который возвращается в мои намерения?

4) Кроме того, из любопытства, что находится внутри класса менеджера пакетов ? Я прочитал здесь , что это похоже на каталог данных приложения. Буду ли я прав, сказав это? Какие данные хранятся о приложении и как я могу получить к ним доступ. Документация, кажется, не очень помогает.

1 Ответ

1 голос
/ 14 апреля 2019

Но что за неявное намерение создается здесь?

Гм ... и ACTION_VIEW Intent, для просмотра запрошенного URL.

могу ли я думать о том, что Android проходит через все классы в моем телефоне и видит, какой из них имеет фильтр намерений, который может обрабатывать данные, и создает структуру намерений для запуска найденного им класса?

Действия регистрируются в манифесте. ОС в основном имеет базу данных всех зарегистрированных видов деятельности и их <intent-filter> подробности, и она использует эту базу данных для поиска кандидатов для любого заданного неявного Intent.

Он просто выбирает значение по умолчанию или просит пользователя выбрать, в каком приложении он хочет работать?

Это зависит от множества факторов, в том числе:

  • Выбрал ли пользователь обработчик по умолчанию для этого вида Intent (например, выбрал веб-браузер по умолчанию)

  • Оберните ли вы Intent, используя Intent.createChooser() для принудительного выбора

  • Зарегистрировано ли приложением ссылка на приложение для URL

Если намерение уже было связано с классом для запуска, зачем вообще беспокоиться о intent.resolveActivity (getPackageManager ())?

Потому что может быть ноль действий для обработки Intent. Даже для чего-то такого же общего, как веб-браузер, конкретный пользователь может не иметь доступа к приложению браузера (профили вторичного пользователя и т. Д.). Если вы попробуете начать действие, и совпадения не будет, вы получите ActivityNotFoundException, поэтому эта проверка пытается избежать такого исключения.

но правильно ли было бы сказать, что Intent.ACTION_VIEW выполняет intent.resolveActivity (getPackageManager ()) или другую функцию, которая выполняет аналогичные функции и каким-то образом включает класс, который возвращается в мое намерение?

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

что находится внутри класса менеджера пакетов?

Немного кода Java. В основном это шлюз IPC для основного процесса ОС, служащий для запроса базы данных установленных приложений, их возможностей и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...