← Назад к вопросам

Какие настройки в AndroidManifest.xml нужны для межприложенного взаимодействия

2.2 Middle🔥 111 комментариев
#Android компоненты#Архитектура и паттерны

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Настройки манифеста для межприложенного взаимодействия

Для организации межприложенного взаимодействия (Inter-App Communication) в Android требуется корректная настройка компонентов и разрешений в AndroidManifest.xml. Основными механизмами являются Activity, Service, BroadcastReceiver и ContentProvider, каждый из которых требует декларации и опциональных параметров.

1. Экспорт компонентов и система безопасности

Ключевой атрибут android:exported определяет, могут ли другие приложения обращаться к компоненту:

  • android:exported="true" — компонент доступен другим приложениям (при необходимости добавьте intent-фильтры или разрешения).
  • android:exported="false" — компонент приватный (только для своего приложения).

Важно: Начиная с Android 12 (API 31), для компонентов с intent-фильтрами необходимо явно указывать android:exported.

2. Настройка Activity для запуска извне

Для Activity, которая должна реагировать на неявные intent'ы из других приложений:

<activity
    android:name=".ShareActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.SEND" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="text/plain" />
    </intent-filter>
</activity>

Атрибуты intent-фильтра:

  • <action> — определяет действие (например, ACTION_VIEW, ACTION_SEND).
  • <category> — категория intent'а (DEFAULT обязательна для неявных intent'ов).
  • <data> — схема, MIME-тип или другие данные.

3. Настройка Service для межпроцессного взаимодействия

Для Service используйте явные intent'ы или задайте android:permission для контроля доступа:

<service
    android:name=".MyBoundService"
    android:exported="true"
    android:permission="com.example.MY_PERMISSION">
    <intent-filter>
        <action android:name="com.example.ACTION_START_SERVICE" />
    </intent-filter>
</service>

Для связанных сервисов (bound service) также определите интерфейс AIDL в папке aidl.

4. Настройка BroadcastReceiver

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

<receiver
    android:name=".MyReceiver"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
        <action android:name="com.example.CUSTOM_ACTION" />
    </intent-filter>
</receiver>

Ограничения: Начиная с Android 8.0, для большинства несистемных broadcast'ов требуется явная регистрация в коде.

5. Настройка ContentProvider

ContentProvider — мощный механизм для общего доступа к данным:

<provider
    android:name=".MyContentProvider"
    android:authorities="com.example.myapp.provider"
    android:exported="true"
    android:readPermission="com.example.READ_PERMISSION"
    android:writePermission="com.example.WRITE_PERMISSION">
    <!-- Опциональные пути данных -->
    <path-permission ... />
</provider>

Атрибуты:

  • android:authorities — уникальный идентификатор провайдера.
  • android:permission — общее разрешение или отдельно readPermission/writePermission.
  • android:grantUriPermissions — временный доступ к URI.

6. Объявление и запрос разрешений

Для защиты компонентов объявите кастомные разрешения:

<permission
    android:name="com.example.MY_PERMISSION"
    android:protectionLevel="signature|dangerous" />

Уровни защиты:

  • signature — только приложения, подписанные тем же ключом.
  • dangerous — требует явного согласия пользователя.
  • normal — предоставляется автоматически.

Запрос разрешений в клиентском приложении:

<uses-permission android:name="com.example.MY_PERMISSION" />

7. Дополнительные настройки и рекомендации

  • URI permissions — для временного доступа к данным ContentProvider через FLAG_GRANT_READ_URI_PERMISSION.
  • android:enabled — можно временно отключать компоненты.
  • android:process — запуск компонента в отдельном процессе (редко требуется).
  • Тестирование — всегда проверяйте взаимодействие через adb shell am start или инструменты вроде Android Debug Bridge.

Пример комплексной настройки

<!-- Объявление кастомного разрешения -->
<permission
    android:name="com.example.ACCESS_DATA"
    android:protectionLevel="signature" />

<!-- Activity для общего доступа -->
<activity
    android:name=".DataViewActivity"
    android:exported="true"
    android:permission="com.example.ACCESS_DATA">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:scheme="content" 
              android:host="com.example.data" />
    </intent-filter>
</activity>

Важные предостережения:

  • Минимизируйте android:exported="true" для снижения поверхностей атаки.
  • Всегда проверяйте входящие intent'ы на корректность данных.
  • Используйте android:permission для защиты экспортируемых компонентов.
  • Для взаимодействия между своими приложениями применяйте уровень защиты signature.

Правильная настройка манифеста обеспечивает безопасность, производительность и соответствие политикам Google Play.