что такое intent в android

Некоторые возможности использования Intent’ов

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

Введение

Объекты типа Intent могут быть использованы для общения между отдельными частями Android приложения, либо между различными приложениями системы. Мощь механизма интентов заключается в том, что с его помощью можно обращаться к любому установленному в системе приложению. Это позволяет повторно использовать некоторые компоненты и значительно сократить время на разработку.

В этой статье я покажу некоторые возможности использования класса Intent для обращения к системным приложениям.

Итак, что можно сделать с помощью Intenta:

1. Позвонить

Необходимо также добавить разрешение совершать звонки:

Либо разрешение для экстренных вызовов:

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

2. Отправить смс

Т.к. этот код не отправляет смс напрямую, а запускает стандартное активити для отправки смс, то никаких разрешений указывать не нужно.

3. Получить контакт из телефонной книги

Этот код откроет стандартное приложение контактов. Метод startActivityForResult позволяет получить uri выбранного контакт из параметра Intent data переопределенного метода onActivityResult.

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

Для чтения списка контактов необходимо также добавить в манифест разрешение:

4. Открыть ссылку в браузере

Данный код откроет переданную в параметре ссылку в одном из установленных браузеров. При этом пользователь сможет сам выбрать браузер для просмотра. Eсли ссылка ведет на YouTube, то можно сразу открыть видео стандартным YouTube приложением.
С помощью этого интента можно также открыть стандартный клиент Android Market с ссылкой на какое-либо приложение. Для этого необходимо в параметр uri передать ссылку вида market://search?q=search query, где search query необходимо заменить соответствующим поисковым запросом.
Разрешения на интернет указывать не нужно, т.к. сеть используется не напрямую, а через приложение браузер.

5. Расшарить контент/написать письмо

Интенту можно задать тему и текст контента, который необходимо разшарить. Метод Intent.createChooser() создает диалог выбора соответствующего приложения.
Если необходимо разшарить медиа контент (изображение/видео), то нужно указать соответствующий тип контента в методе setType, например mailIntent.setType(«image/png»);, а также добавить сам контент в extra интента:

С помощью этого интента можно также отправить электронную почту по конкретному адресу:

6. Открыть карту по определенным координатам либо запросу
7. Сделать снимок с камеры

Этот код запускает стандартное приложение камеры. Полученное с камеры изображение можно обработать в методе onActivityResult:

Изображение, полученное с камеры при этом можно сохранить в конкретной директории, добавив параметр в интент:

Для использования этого интента не нужно разрешения android.permission.CAMERA, т.к. камера используется не напрямую, а всего лишь вызывается встроенное приложение камеры. Однако рекомендуется добавить в AndroidManifest следующую строку:

Таким образом, люди с девайсами без встроенной камеры (судя по всему, такое тоже бывает) не будут видеть ваше приложение на маркете.

8. Позвонить какому-либо контакту через Skype

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

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

Более простым методом проверки наличия приложения в системе является перехват ActivityNotFoundException, которое будет вылетать в методе startActivity. Однако это позволит всего лишь среагировать на проблему, но не предотвратить ее. Например, используя вышеприведенный метод isIntentAvailable можно вовремя сделать соответствующий контрол неактивным, либо перенаправить пользователя на Android Market для установки соответствующего приложения.

9. Использовать Speech to Text для распознавания голоса

Этот код запускает приложение распознавания речи. Если произнести что-либо, система обработает голос и вернет результат в метод onActivityResult:

Источник

Как работает Android, часть 3

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

В этой статье я расскажу о компонентах, из которых состоят приложения под Android, и об идеях, которые стоят за этой архитектурой.

Web vs desktop

Если задуматься об отличиях современных веб-приложений от «обычных» десктопных приложений, можно — среди недостатков — выделить несколько преимуществ веба:

Кроме того, веб-приложения существуют в виде страниц, которые могут ссылаться друг на друга — как в рамках одного сайта, так и между сайтами. При этом страница на одном сайте не обязана ограничиваться ссылкой только на главную страницу другого, она может ссылаться на конкретную страницу внутри другого сайта (это называется deep linking). Ссылаясь друг на друга, отдельные сайты объединяются в общую сеть, веб.

Несколько копий одной страницы — например, несколько профилей в социальной сети — могут быть одновременно открыты в нескольких вкладках браузера. Интерфейс браузера рассчитан на переключение между одновременными сессиями (вкладками), а не между отдельными сайтами — в рамках одной вкладки вы можете перемещаться по ссылкам (и вперёд-назад по истории) между разными страницами разных сайтов.

Всё это противопоставляется «десктопу», где каждое приложение работает отдельно и часто независимо от других — и в этом плане то, как устроены приложения в Android, гораздо ближе к вебу, чем к «традиционным» приложениям.

Activities & intents

Основной вид компонентов приложений под Android — это activity. Activity — это один «экран» приложения. Activity можно сравнить со страницей в вебе и с окном приложения в традиционном оконном интерфейсе.

Собственно окна в Android тоже есть на более низком уровне — уровне window manager. Каждой activity обычно соответствует своё окно. Чаще всего окна activity развёрнуты на весь доступный экран, но:

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

Например, в приложении для электронной почты (email client) могут быть такие activity, как Inbox Activity (список входящих писем), Email Activity (чтение одного письма), Compose Activity (написание письма) и Settings Activity (настройки).

Как и страницы одного сайта, activity одного приложения могут запускаться как друг из друга, так и независимо друг от друга (другими приложениями). Если в вебе на другую страницу обращаются по URL (ссылке), то в Android activity запускаются через intent’ы.

Intent — это сообщение, которое указывает системе, что нужно «сделать» (например, открыть данный URL, написать письмо на данный адрес, позвонить на данный номер телефона или сделать фотографию).

Приложение может создать такой intent и передать его системе, а система решает, какая activity (или другой компонент) будет его выполнять (handle). Эта activity запускается системой (в существующем процессе приложения или в новом, если он ещё не запущен), ей передаётся этот intent, и она его выполняет.

Стандартный способ создавать intent’ы — через соответствующий класс в Android Framework. Для работы с activity и intent’ами из командной строки в Android есть команда am — обёртка над стандартным классом Activity Manager:

Intent’ы могут быть явными (explicit) и неявными (implicit). Явный intent указывает идентификатор конкретного компонента, который нужно запустить — чаще всего это используется, чтобы запустить из одной activity другую внутри одного приложения (при этом intent может даже не содержать другой полезной информации).

Неявный intent обязательно должен указывать действие, которое нужно сделать. Каждая activity (и другие компоненты) указывают в манифесте приложения, какие intent’ы они готовы обрабатывать (например, ACTION_VIEW для ссылок с доменом https://example.com ). Система выбирает подходящий компонент среди установленных и запускает его.

Если в системе есть несколько activity, которые готовы обработать intent, пользователю будет предоставлен выбор. Обычно это случается, когда установлено несколько аналогичных приложений, например несколько браузеров или фоторедакторов. Кроме того, приложение может явно попросить систему показать диалог выбора (на самом деле при этом переданный intent оборачивается в новый intent с ACTION_CHOOSER ) — это обычно используется для создания красивого диалога Share:

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

Кроме того, activity может вернуть результат в вызвавшую её activity. Например, activity в приложении-камере, которая умеет обрабатывать intent «сделать фотографию» ( ACTION_IMAGE_CAPTURE ) возвращает сделанную фотографию в ту activity, которая создала этот intent.

При этом приложению, содержащему исходную activity, не нужно разрешение на доступ к камере.

Таким образом, правильный способ приложению под Android сделать фотографию — это не потребовать разрешения на доступ к камере и использовать Camera API, а создать нужный intent и позволить системному приложению-камере сделать фото. Аналогично, вместо использования разрешения READ_EXTERNAL_STORAGE и прямого доступа к файлам пользователя стоит дать пользователю возможность выбрать файл в системном файловом менеджере (тогда исходному приложению будет разрешён доступ именно к этому файлу).

A unique aspect of the Android system design is that any app can start another app’s component. For example, if you want the user to capture a photo with the device camera, there’s probably another app that does that and your app can use it instead of developing an activity to capture a photo yourself. You don’t need to incorporate or even link to the code from the camera app. Instead, you can simply start the activity in the camera app that captures a photo. When complete, the photo is even returned to your app so you can use it. To the user, it seems as if the camera is actually a part of your app.

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

Само разрешение на доступ к камере нужно только тем приложениям, которые реализуют свой интерфейс камеры — например, собственно приложения-камеры, приложения для видеозвонков или дополненной реальности. Наоборот, обыкновенному мессенджеру доступ к камере «чтобы можно было фото отправлять» не нужен, как не нужен и доступ к совершению звонков приложению крупного банка.

Этой логике подчиняются даже такие «части системы», как, например, домашний экран (лончер, launcher). Лончер — это специальное приложение со своими activity (которые используют специальные флаги вроде excludeFromRecents и launchMode=»singleTask» ).

Приложение может иметь несколько activity, которые поддерживают такой intent, и отображаться в лончере несколько раз (при этом может понадобиться указать им разную taskAffinity ). Или не иметь ни одной и не отображаться в лончере вообще (но по-прежнему отображаться в полном списке установленных приложений в настройках). «Обычные» приложения так делают довольно редко; самый известный пример такого поведения — Google Play Services.

Многие операционные системы делятся на собственно операционную систему и приложения, установленные поверх, ничего друг о друге не знающие и не умеющие взаимодействовать. Система компонентов и intent’ов Android позволяет приложениям, по-прежнему абсолютно ничего друг о друге не зная, составлять для пользователя один интегрированный системный user experience — установленные приложения реализуют части одной большой системы, они составляют из себя систему. И это, с одной стороны, происходит прозрачно для пользователя, с другой — представляет неограниченные возможности для кастомизации.

По-моему, это очень красиво.

Tasks & back stack

Как я уже говорил, в браузере пользователь может переключаться не между сайтами, а между вкладками, история каждой из которых может содержать много страниц разных сайтов. Аналогично, в Android пользователь может переключаться между задачами (tasks), которые отображаются в виде карточек на recents screen. Каждая задача представляет собой back stack — несколько activity, «наложенных» друг на друга.

Когда одна activity запускает другую, новая activity помещается в стек поверх старой. Когда верхняя activity в стеке завершается — например, когда пользователь нажимает системную кнопку «назад» — предыдущая activity в стеке снова отображается на экране.

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

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

App lifecycle

Одно из основных ограничений встраиваемых и мобильных устройств — небольшое количество оперативной памяти (RAM). Если современные флагманские устройства уже оснащаются несколькими гигабайтами оперативной памяти, то в первом смартфоне на Android, HTC Dream (он же T-Mobile G1), вышедшем в сентябре 2008 года, её было всего 192 мегабайта.

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

Проблема ограниченной памяти дополнительно осложняется тем, что в мобильных устройствах, в отличие от «обычных» компьютеров, не используются swap-разделы (и swap-файлы) — в том числе и из-за низкой (по сравнению с SSD и HDD) скорости доступа к SD-картам и встроенной флеш-памяти, где они могли бы размещаться. Начиная с версии 4.4 KitKat, Android использует zRAM swap, то есть эффективно сжимает малоиспользуемые участки памяти. Тем не менее, проблема ограниченной памяти остаётся.

Если все процессы представляют собой для системы чёрный ящик, лучшая из возможных стратегия поведения в случае нехватки свободной памяти — принудительно завершать («убивать») какие-то процессы, что и делает Linux Out Of Memory (OOM) Killer. Но Android знает, что происходит в системе, ему известно, какие приложения и какие их компоненты запущены, что позволяет реализовать гораздо более «умную» схему освобождения памяти.

Если пользователь возвращается в activity приложения, завершённого системой из-за нехватки памяти, эта activity запускается снова. При этом перезапуск происходит прозрачно для пользователя, поскольку activity сохраняет своё состояние при завершении ( onSaveInstanceState ) и восстанавливает его при последующем запуске. Реализованные в Android Framework виджеты используют этот механизм, чтобы автоматически сохранить состояние интерфейса (UI) при перезапуске — с точностью до введённого в EditText текста, положения курсора, позиции прокрутки (scroll) и т.д. Разработчик приложения может дополнительно реализовать сохранение и восстановление каких-то ещё данных, специфичных для этого приложения.

Подчеркну, что Android может перезапускать приложения не полностью, а покомпонентно, оставляя неиспользуемые части завершёнными — например, из двух копий одной activity одна может быть перезапущена, а другая остаться завершённой.

С точки зрения пользователя этот механизм похож на использование swap: в обоих случаях при возвращении в выгруженную часть приложения приходится немного подождать, пока она загружается снова — в одном случае, с диска, в другом — пересоздаётся по сохранённому состоянию.

Именно этот механизм автоматического перезапуска и восстановления состояния создаёт у пользователя ощущение, что приложения «запущены всегда», избавляя его от необходимости явно запускать и закрывать приложения и сохранять введённые в них данные.

Services

Приложениям может потребоваться выполнять действия, не связанные напрямую ни с какой activity, в том числе, продолжать делать их в фоне, когда все activity этого приложения завершены. Например, приложение может скачивать из сети большой файл, обрабатывать фотографии, воспроизводить музыку, синхронизировать данные или просто поддерживать TCP-соединение с сервером для получения уведомлений.

Такую функциональность нельзя реализовывать, просто запуская отдельный поток — это было бы для системы чёрным ящиком; в том числе, процесс был бы завершён при завершении всех activity, независимо от состояния таких фоновых операций. Вместо этого Android предлагает использовать ещё один вид компонентов — сервис.

Сервис нужен, чтобы сообщить системе, что в процессе приложения выполняются действия, которые не являются частью activity этого приложения. Сам по себе сервис не означает создание отдельного потока или процесса — его точки входа (entry points) запускаются в основном потоке приложения. Обычно реализация сервиса запускает дополнительные потоки и управляет ими самостоятельно.

Сервисы во многом похожи на activity: они тоже запускаются с помощью intent’ов и могут быть завершены системой при нехватке памяти.

Запущенные сервисы могут быть в трёх состояниях:

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

Background service — сервис, выполняющий фоновое действие, состояние которого не интересует пользователя (чаще всего, синхронизацию). Такие сервисы могут быть завершены при нехватке памяти с гораздо большей вероятностью. В старых версиях Android большое количество одновременно запущенных фоновых сервисов часто становилось причиной «тормозов»; начиная с версии 8.0 Oreo, Android серьёзно ограничивает использование фоновых сервисов, принудительно завершая их через несколько минут после того, как пользователь выходит из приложения.

Bound service — сервис, обрабатывающий входящее Binder-подключение. Такие сервисы предоставляют какую-то функциональность для других приложений или системы (например, WallpaperService и Google Play Services). В этом случае система может автоматически запускать сервис при подключении к нему клиентов и останавливать его при их отключении.

Рекомендуемый способ выполнять фоновые действия — использование JobScheduler, системного механизма планирования фоновой работы. JobScheduler позволяет приложению указать критерии запуска сервиса, такие как:

JobScheduler планирует выполнение (реализованное как вызов через Binder) зарегистрированных в нём сервисов в соответствии с указанными критериями. Поскольку JobScheduler — общесистемный механизм, он учитывает при планировке критерии зарегистрированных сервисов всех установленных приложений. Например, он может запускать сервисы по очереди, а не одновременно, чтобы предотвратить резкую нагрузку на устройство во время использования, и планировать периодическое выполнение нескольких сервисов небольшими группами (batch), чтобы предотвратить постоянное энергозатратное включение-выключение радиооборудования.

Как можно заметить, использование JobScheduler не может заменить собой одного из вариантов использования фоновых сервисов — поддержания TCP-соединения с сервером для получения push-уведомлений. Если бы Android предоставлял приложениям такую возможность, устройству пришлось бы держать все приложения, соединяющиеся со своими серверами, запущенными всё время, а это, конечно, невозможно.

Решение этой проблемы — специальные push-сервисы, самый известный из которых — Firebase Cloud Messaging от Google (бывший Google Cloud Messaging).

Клиентская часть FCM реализована в приложении Google Play Services. Это приложение, которое специальным образом исключается из обычных ограничений на фоновые сервисы, поддерживает одно соединение с серверами Google. Разработчик, желающий отправить своему приложению push-уведомление, пересылает его через серверную часть FCM, после чего приложение Play Services, получив сообщение, передаёт его приложению, которому оно предназначено.

Такая схема позволяет, с одной стороны, мгновенно доставлять push-уведомления всем приложениям (не дожидаясь следующего периода синхронизации), с другой стороны, не держать множество приложений одновременно запущенными.

Broadcast receivers & content providers

Кроме activity и сервисов, у приложений под Android есть два других вида компонентов, менее интересных для обсуждения — это broadcast receiver’ы и content provider’ы.

Broadcast receiver — компонент, позволяющий приложению принимать broadcast’ы, специальный вид сообщений от системы или других приложений. Исходно broadcast’ы, как следует из названия, в основном использовались для рассылки широковещательных сообщений всем подписавшимся приложениям — например, система посылает сообщение AIRPLANE_MODE_CHANGED при включении или отключении самолётного режима.

Content provider — компонент, позволяющий приложению предоставлять другим приложениям доступ к данным, которыми оно управляет. Пример данных, доступ к которым можно получить таким образом — список контактов пользователя.

При этом приложение может хранить сами данные каким угодно образом, в том числе на устройстве в виде файлов, в настоящей базе данных (SQLite) или запрашивать их с сервера по сети. В этом смысле content provider — это унифицированный интерфейс для доступа к данным, независимо от формы их хранения.

Именно поверх content provider’ов реализован Storage Access Framework, позволяющий приложениям, хранящим файлы в облаке (например, Dropbox и Google Photos) предоставлять доступ к ним остальным приложениям, не занимая место на устройстве полной копией всех хранящихся в облаке файлов.

В следующей статье я расскажу о процессе загрузки Android, о содержимом файловой системы, о том, как хранятся данные пользователя и приложений, и о root-доступе.

Источник

Руководство Android Intents

View more Tutorials:

1- Что такое Intent?

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

intent это объект класса android.content.Intent. Ваш код можно отправить на Intent в систему Android с определением компонентов, которые вы хотите достичь.

Например, через startActivity(), вы сможете дать определение Intent который использвует для вызова другого Activity. В целевом Activity через метод startActivity() вы сможете определить намерение отправителя вызвать данный (start) Activity.

Intent может содержать данные через Bundle. Данные могут использоваться принимающим компонентом.

2- Вилы Intent

Android поддерживает 2 вида Intent это явные (explicit) Intent và и неявные (implicit) Intent.

Приложение может определить целевой компонент непосредственно Intent (явное намерение) или запросить систему Android оценить загистрированные компоненты основываясь на намерения данных (неявные Intent).

3- Явный Intent

4- Фильтр Intent (Intent Filter)

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

5- Неявный Intent

что такое intent в android. Смотреть фото что такое intent в android. Смотреть картинку что такое intent в android. Картинка про что такое intent в android. Фото что такое intent в android

View more Tutorials:

Это онлайн курс вне вебсайта o7planning, который мы представляем, он включает бесплатные курсы или курсы со скидкой.

Источник

Intent (Намерение)

Общее

Но это не единственный вариант использования намерения. Также можно использовать для объявления о запуске активности или сервиса, направленных на выполнение каких-либо действий (как правило, речь о работе с определенной частью данных) или для передачи уведомлений о том, что произошло некое событие (или действие).

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

Android транслирует намерения для объявления о системных событиях, например об изменениях в состоянии сетевого подключения или в уровне заряда батареи. Системные приложения в Android, такие как программы дозвона или управления SMS, регистрируют компоненты, отслеживающие заданные намерения, например входящий звонок или получено новое SMS-сообщение, и соответствующим образом реагируют на них.

Явные намерения

Вспомним код для перехода на вторую активность в своём приложении:

В намерении мы явно указали имя класса активности во втором параметре. Данный класс у нас прописан в манифесте, и система, просматривая манифест, запустит нужную активность. Вот почему у нас сначала программа завершалась с ошибкой. Когда мы создали класс, но не прописали его в манифесте, то система не понимала, чего от неё хотят.

Первый параметр – это Context. Активность является подклассом Context, поэтому мы можем использовать её как HelloWorld.this, или укороченную запись this.

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

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

Также при переходе на другую активность мы можем указать какие-то данные, а принимающая активность должна уметь обработать их. Для этих целей существуют методы типа putXXX(). Например, для передачи списка файлов из одной активности в другую:

По похожему сценарию можно передать простые типы и строки.

При работе с действиями, возвращающими данные, нельзя использовать метод startActivity(), поскольку он не возвращает результат. Если вы хотите вернуть данные, то можете использовать метод startActivityForResult(), приспособленный для работы с обратными вызовами.

Неявные намерения

Существует также неявный вызов активности. В этом случае при создании намерения мы используем не имя класса, а указываем параметры action, data, category с определёнными значениями. Система анализирует, что мы тут такого понаписали и начинает подбирать подходящий вариант для запуска. Например, если указали в параметрах адрес веб-страницы, то скорее всего хотим запустить браузер и почитать новость, что Кот Ларри уволен с поста «главного мышелова» резиденции британского премьера (нехороший премьер-министр, пусть только в Москву сунется).

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

К слову сказать, мы тоже можем прописать в своей активности в фильтрах намерений (Intent Filter) набор тех же параметров: action, data, category. И тогда у пользователя может запуститься не только стандартный браузер, но и наша программа (Кот Матроскин в таких случаях говорил: Подумаешь, я еще и вышивать могу. и на машинке тоже..).

Иными словами, если параметры намерения совпадают с условиями нашего фильтра, то наше приложение (активность) будет вызвано. Система сканирует активности всех установленных приложений, и если находится несколько подходящих активностей, то Android предоставляет пользователю выбор, какой именно программой следует воспользоваться. Если найдётся только одна подходящая активность, то, естественно, никакого диалога для выбора не будет, и активность запустится автоматически.

Неявные намерения — это механизм, позволяющий запрашивать анонимные компоненты приложений с помощью действий. Вы можете попросить систему запустить активность, выполняющую заданное действие, не зная ничего ни о самой активности, ни о её приложении. Например, мы указываем телефонный номер, но понятия не имеем, как программой дозвона пользуется пользователь на своём телефоне. Но это уже не наша проблема, пусть пользователь сам выбирает, как ему звонить по номеру, который мы можем ему предоставить.

Создавая новое неявное намерение для передачи в метод startActivity(), необходимо назначить действие, которое должно выполниться, а также при желании указать вспомогательный путь URI к тем данным, что нужно обработать. Вы также можете передать дополнительные данные в другую активность, используя параметр намерения extras.

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

Простой пример создания намерения с предопределённым действием ACTION_VIEW для запуска браузера и перехода на нужный адрес:

В данном случае действие ACTION_VIEW означает просмотр чего-либо. Мы указали нужные данные (адрес), и происходит запуск новой активности (браузера). При этом исходная активность приостанавливается и переходит в фоновый режим. Когда пользователь нажимает на кнопку Back, то он возвращается к исходной активности. Обратите внимание, что мы нигде не указываем конкретную программу-браузер типа Chrome, Opera и т.п.

В каждом случае Android находит соответствующую активность, чтобы ответить на намерение, инициализируя её в случае необходимости.

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

Раньше я писал код без условия if и это было рабочим решением. Но следует помнить, что нет никакой гарантии, что приложение, способное обработать ваше намерение, будет установлено и доступно на устройстве. Конечно, вероятность того, что у пользователя не будет звонилки, достаточна низка. А если приложение установлено на планшете без телефонного модуля? А если появятся холодильники или стиральные машины с Android на борту? Чтобы узнать, будет ли запущена активность для вашего намерения, можно отправить запрос Менеджеру пакетов при помощи метода resolveActivity(). Поэтому в примере выше пришлось поставить дополнительную проверку. Желательно делать такую проверку во всех примерах, где-то я мог просто пропустить старый код.

Объект Intent содержит информацию, представляющую интерес для компонента, который получает намерение, и данные, которые передаются этому компоненту. Кроме того, объект Intent содержит информацию, представляющую интерес для системы Android, — имя компонента, который должен обработать намерение и набор параметров запуска этого компонента. Как правило, объект Intent может содержать следующие поля:

Система и приложения, которые идут в комплекте с платформой, также используют объекты Intent для активизации определённых системой компонентов (например, различных приложений и служб при загрузке системы).

Константы действия

Константы категорий

Методы

Для работы с категориями в классе Intent определена группа методов:

Фильтры намерений и запуск заданий

Если намерение запрашивает выполнение какого-либо действия с определённым набором данных, то системе нужно уметь выбрать приложение (или компонент) для обслуживания этого запроса. На помощь приходят фильтры намерений, которые используются для регистрации активностей, сервисов и широковещательных приёмников в качестве компонентов, способных выполнять заданные действия с конкретным видом данных. С помощью этих фильтров также регистрируются широковещательные приёмники, настроенные на трансляцию намерением заданного действия или события.

Задействуя фильтры намерений, приложения объявляют, что они могут отвечать на действия, запрашиваемые любой другой программой, установленной на устройстве. Чтобы зарегистрировать компонент приложения в качестве потенциального обработчика намерений, нужно добавить тег в узел компонента в манифесте.

В фильтре намерений декларируется только три составляющих объекта Intent: действие, данные, категория. Дополнения и флаги не играют никакой роли в принятии решения, какой компонент получает намерение.

Например, в любом приложении есть главная активность, которая устанавливается как точка входа для задания:

Внутри узла Фильтра намерений можно использовать такие теги (и соответствующие атрибуты).

Принцип работы фильтров намерений

При использовании метода startActivity() передаваемое неявное намерение, как правило, доходит лишь до одной активности. Если для выполнения заданного действия с указанными данными годятся сразу несколько активностей, пользователю предоставляется список выбора. Процесс, когда решается, какую активность лучше запустить, называется Утверждением намерений. Его цель — найти наиболее подходящий фильтр намерений. В целом весь алгоритм работает следующим образом.

Поиск и использование намерения, с помощью которого была запущена активность

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

Используйте метод getIntent() (как правило, внутри метода onCreate()), чтобы извлечь намерение, с помощью которого компонент запущен.

Применяйте методы getAction() и getData(), чтобы найти действие и данные, связанные с намерением. Для извлечения дополнительной информации, хранящейся в параметре extras, используйте типизированные методы get Extra.

Делегирование ответственности

Задействуйте метод startNextMatchingActivity() для делегирования ответственности за обработку действия следующему компоненту, который лучше всего для этого подходит.

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

ACTION_PICK

Принцип ACTION_PICK заключается в том, чтобы запустить активность, отображающую список элементов. После этого активность должна предоставлять пользователю возможность выбора элемента из этого списка. Когда пользователь выберет элемент, активность возвратит URI выбранного элемента вызывающей стороне. Таким образом, можно многократно использовать функцию UI для выбора нескольких элементов определённого типа.

Следующий код выведет диалоговое окно со списком всех возможных программ, которые могут запустить активность с данными, так как мы не указываем конкретный тип (setType(«*/*»)):

Если мы укажем конкретный тип данных, которые нас интересует, то список программ существенно сузится. Например, если указать intent.setType(«image/*»);, то можем увидеть только системную программу Галерея для просмотра картинок (у пользователя могут быть установлены программы, которые также предназначены для просмотра картинок, поэтому список может отличаться).

ACTION_SEND

Очень распространённое намерение. Используйте метод setType(), чтобы указать тип MIME для передаваемых данных. Эти данные должны храниться в параметре намерения extras с ключами EXTRA_TEXT или EXTRA_STREAM, в зависимости от типа. В случае с электронной почтой стандартное приложение в Android также принимает дополнительные параметры по ключам EXTRA_EMAIL, EXTRA_CC, EXTRA_BCC и EXTRA_SUBJECT.

Если есть установленное приложение с фильтром, который соответствует ACTION_SEND и MIME-типу text/plain, система Android запустит его, а если будет найдено более одного приложения, то система отобразит диалог выбора, который позволяет пользователю выбрать приложение.

Если ваша активность хочет обрабатывать подобные намерения, то она должна содержать следующие данные:

Имя сообщает Android, что активность может обрабатывать ACTION_SEND.

Фильтр должен включать категорию DEFAULT, в противном случае он не сможет получать неявные намерения.

Указываем типы данных, которые могут обрабатываться активностью.

ACTION_GET_CONTENT

Выбрать файл

Если вы не хотите писать собственный менеджер файлов, а готовы использовать готовые приложения для выбора файла, то можете использовать следующий код:

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

В коде мы получаем полный путь к файлу через метод getPath(). Если вам нужно получить раздельно имя каталога и имя файла, то потребуется небольшая модификация:

Диалоговое окно выбора

При выборе из списка программ пользователь может выбрать программу по умолчанию, которая будет автоматически запускаться при выбранном намерении. В этом случае диалоговое окно выводиться не будет. Но можно принудительно выводить диалоговое окно при помощи метода createChooser() и пользователю придётся каждый раз выбирать нужную активность:

Если на устройстве не будет подходящих активностей для запуска, то createChooser() обработает данную ситуацию и выведет соответствующее сообщение. В этом заключается его преимущество. Если передать методу startActivity() намерение, для которого не найдётся подходящей активности, то возникнет исключение ActivityNotFoundException. И вам придётся перехватывать его в блоке try/catch, чтобы избежать аварийного завершения приложения.

Android 12

Также допустимо использовать true, если ваша активность использует , чтобы другие приложения могли открыть ваше программу. Аналогично справедливо для случаев и .

Другие примеры использования намерений

Запустить другую активность вашего приложения можно не только стандартным способом, о котором говорится в первом курсе, но и другим немного странным способом. Прописываем в манифесте у второй активности мета-данные:

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *