Как в приложениях Android реализована кнопка «Поделиться»?

11

Мне было интересно, как в приложениях Android и Android реализованы кнопка «Поделиться» и механизм обмена. Например, когда я нажимаю кнопку «Поделиться» на YouTube, появляется список приложений для обмена. Как определяется этот список? Есть ли конкретное намерение «поделиться», и тогда появятся все точки, способные делиться типом намерения, указанным в дополнениях? Какое техническое имя шаблона проектирования используется для реализации этого? Спасибо.

Джек Мэддингтон
источник
1
Вы действительно имели в виду "какашки", или это опечатка для "попс"? В американском английском, по крайней мере, первое - это то, что делают дети с подгузниками.
JDługosz
Вы правы. Я недавно переключился на клавиатуру Swype на Android, которая позволяет печатать быстрее, но иногда она вводит неправильное слово, и я не замечаю. Пока не знаю, что с этим делать, я не очень осторожный человек. Иногда в саб и даже не вижу экран должным образом.
Джек Мэддингтон
В подводной лодке (подводной лодке?)! Что делать: вычитать перед отправкой. И не загрязняйте свой список предсказаний смущающими словами.
JDługosz
По совпадению мой список предсказаний заполнен материалами из старых писем, которые Swype прочитал автоматически. Хлоп!
Джек Мэддингтон

Ответы:

10

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

Intents

Намерение в Android является то , что используется для запуска приложения. Он может работать как ярлык или как файловая ассоциация Windows. Намерение может указать имя приложения для запуска, но это не обязательно. Он также может указывать действие, которое нужно выполнить (например, «открыть основное действие», «просмотреть этот URL», «создать запись в календаре») и тип MIME объекта, на который он будет действовать (например, то, что вы хотите просмотреть имеет тип изображения / JPEG). Некоторые имена действий относятся к конкретному приложению, но многие из них стандартизированы Android, чтобы позволить приложениям взаимодействовать.

Фильтры намерений и коммуникационное приложение

Каждое приложение определяет намеренные фильтры, чтобы сказать, какие действия оно может выполнить. например, приложение для просмотра изображений зарегистрирует фильтр намерений для «просмотра этого URL», где тип MIME - «image / *»; веб-браузер регистрирует фильтр намерений для «просмотра этого URL», где схема URL - «http» или «https». Чтобы иметь возможность делиться вещами, приложение регистрирует фильтр намерений для намерения «отправить», либо с определенным типом (например, если оно может только обмениваться фотографиями), либо для любого типа.

Контент приложение

Приложение, которое хочет поделиться некоторым контентом, создает намерение с действием «поделиться» и URL, указывающим на контент для обмена. (Это часто «временный» URL-адрес, который дает принимающему приложению временный доступ к файлу в личном хранилище приложения с контентом или к потоку, созданному приложением с контентом.) В нем не указывается имя приложения для обработки намерение. Затем он передает это намерение платформе Android и просит Android отобразить диалоговое окно выбора . Android сравнивает намерение с фильтрами намерений из всех установленных приложений, создает список и показывает его пользователю. Когда пользователь выбирает конкретное приложение, Android запускает это приложение и передает его намерение. Приложение использует URL-адрес для получения содержимого из исходного приложения.

Новое в Зефире: Прямая доля

У Зефира есть еще один механизм, который называется Direct Share . Это дополняет механизм намерений, так что вы можете выбирать людей или группы для совместного использования непосредственно из диалога выбора, пропуская дополнительный шаг «кому бы вы хотели его отправить». Это работает немного по-другому: коммуникационное приложение должно предоставлять услугу. Когда приложение с содержимым запрашивает выбор, Android запускает службу для каждого соответствующего приложения. Сервис возвращает список релевантных целей общего ресурса , и Android собирает все эти отдельные списки в список, который отображается в диалоговом окне.

Дэн Халм
источник
Но я видел, что приложения показывают довольно много разных диалогов выбора. Все они действительно отображаются операционной системой, или само приложение может получить список целей?
user1686
@grawity Во встроенном диалоговом окне есть несколько параметров настройки (например, для задания заголовка), но приложение также может запросить у Android список целей общего доступа и поместить их в свой собственный диалог. Мой выбор браузера bURLy является примером этого, но с намерением «открыть URL» вместо намерения «отправить».
Дэн Халм
11

Я не разработчик, поэтому я могу дать грубое объяснение: приложения объявляют в своих ManifestMimetypes, которые они понимают и на которые они хотят реагировать в действиях по обмену. Для этого они определяют так называемые «фильтры намерений», например:

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT"/>
    <data android:mimeType="application/*" />
    <data android:mimeType="audio/*" />
    <data android:mimeType="image/*" />
    <data android:mimeType="message/*" />
    <data android:mimeType="multipart/*" />
    <data android:mimeType="text/*" />
    <data android:mimeType="video/*" />
</intent-filter>

Поэтому всякий раз, когда вы нажимаете кнопку «Поделиться», контент для обмена оценивается и сопоставляется с приложениями, заявившими о своей готовности получить формат.

Источники:

Иззи
источник
1
Это в значительной степени это прямо. Само приложение (делящееся) может отфильтровать некоторых намеренных респондентов, но большинство этого не делают.
Котейр
2
@HiltonShumway, поэтому я проголосовал за его ответ. Помимо меня, Дэн в разработке и гораздо лучше знает, как обстоят дела вместе. Поэтому, когда я отправил свой ответ, я надеялся, что он также опубликует его - он не разочаровал мою надежду :)
Иззи