Intent

https://developer.android.com/reference/android/content/Intent
https://developer.android.com/reference/android/app/PendingIntent
https://developer.android.com/privacy-and-security/risks/pending-intent
Intent

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

Explicit Intent (Явный)

Тип Intent, который используется для запуска конкретного компонента внутри приложения, например, Activity или Service. В явном интенте явно указывается целевой компонент, который нужно запустить, обычно с помощью имени класса. Этот тип Intent чаще всего применяется для взаимодействия внутри одного приложения.

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value") // передача данных в следующую активность
startActivity(intent)
Implicit intent (Неявный)

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

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.example.com")
startActivity(intent)
Intent Resolution

Это процесс, при котором Android определяет, какое приложение или компонент должен обработать конкретный Intent. Когда приложение отправляет Intent, система ищет подходящие компоненты, основываясь на данных, переданных в Intent (например, action, type, category), и возвращает подходящее приложение или Activity для обработки запроса.

Intent Filters

Intent Filters позволяют компонентам приложения объявлять, какие Intents они могут обрабатывать.

<activity android:name=".WebViewActivity">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" /> <!-- Указывает, что данная Activity может обрабатывать Intents с действием VIEW. -->
        <category android:name="android.intent.category.DEFAULT" /> <!-- Указывает, что данный компонент является стандартным и может обрабатывать Intents, которые не имеют специальных категорий. -->
        <data android:scheme="http" /> <!-- Указывает, что данный компонент может обрабатывать URL с протоколами http и https. -->
        <data android:scheme="https" />
    </intent-filter>
</activity>
// Отправить Intent для открытия веб-страницы

val url = "https://www.example.com"
val intent = Intent(Intent.ACTION_VIEW).apply {
    data = Uri.parse(url)
    addCategory(Intent.CATEGORY_BROWSABLE)
}
startActivity(intent)
Action

Определяет действие, которое будет выполнено. Например, Intent.ACTION_VIEW для просмотра данных.

Data

Указывает тип данных, с которыми работает компонент. Например, android:scheme="http" для работы с URL.

Category

Позволяет дополнительно уточнить тип компонента. Например, Intent.CATEGORY_DEFAULT для стандартной обработки.

PendingIntent

Это специальный тип Intent, который позволяет другим приложениям или компонентам (например, AlarmManager, NotificationManager) выполнять действия от имени вашего приложения. Он используется для предоставления доступного Intent, который может быть выполнен в будущем, даже если ваше приложение не активно. PendingIntent переживает остановку процесса и может использоваться для старта приложения.

FLAG_UPDATE_CURRENT

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

val intent = Intent(context, TargetActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)
FLAG_IMMUTABLE

Иммутабельный PendingIntent. После создания его нельзя изменить. Иммутабельные PendingIntent более безопасны, так как их нельзя подменить злоумышленником.

val intent = Intent(context, TargetActivity::class.java)
val pendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE)
Вопросы на собесе (12)
  • PendingIntent (2)
    1. Что такое PendingIntent, и в каких случаях его можно использовать?

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

    1. Различие между Intent и PendingIntent?

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

  • Другие (10)
    1. Какие существуют типы Intent, и в каких случаях их следует использовать?

      Явные Intents: Указывают конкретный компонент (Activity, Service), который должен быть запущен. Используются, когда вы хотите запустить свой собственный компонент.

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

    1. Какие данные можно передавать через Intent?

      Примитивные типы (int, float, boolean и т. д.)

      Строки (String).

      Массивы примитивных типов и строк.

      Объекты, реализующие интерфейс Parcelable или Serializable.

    1. Можно ли передать через Intent массив примитивов?

      Да, в Intent можно положить массив примитивных типов, таких как intArray, floatArray, booleanArray и т. д.

    1. Как передать данные между Activity с помощью Intent?

      Использовать методы putExtra() и getExtra().

    1. Как запустить Activity с использованием Intent, и как вернуть результат обратно в исходную Activity?

      Используйте методы startActivityForResult() и setResult().

    1. Как неявный интент понимает какие компоненты могут его обрабатывать?

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

    1. Что произойдет при вызове неявного интента если не будет найдено подходящего приложения?

      Система вызовет ActivityNotFoundException, и приложение может завершиться с ошибкой.

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

      Да, мы можем запустить компонент другого приложения с помощью явного интента, указав точное имя компонента (например, Activity, Service) другого приложения. Однако это возможно только если целевой компонент настроен для обработки внешних запросов с помощью соответствующих разрешений и фильтров в его манифесте (exported=true).

    1. Что такое Intent Filter?

      Intent Filter используется для указания, какие типы интентов может обрабатывать компонент приложения (например, Activity или Service). Он позволяет приложению реагировать на внешние интенты, такие как действия других приложений.

    1. Для чего из нижеперечисленного нужны интенты? (Может быть несколько вариантов ответов)

      Стартовать Activity.

      Запустить Service.

      Отрисовать Android View.

      Отправить Broadcast.