Назад к вопросам
Middle
85
questionbank

Что означает атрибут android:exported со значениями 'true' и 'false'?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Атрибут android:exported в манифесте Android App (AndroidManifest.xml) определяет, могут ли компоненты вашего приложения (Activity, Service, BroadcastReceiver, ContentProvider) быть доступны другим приложениям или процессам в системе.

android:exported="true":

  • Компонент может быть вызван или доступен из других приложений.
  • Например, если Activity отмечена как exported="true", другое приложение может запустить эту Activity с помощью Intent.
  • Это необходимо, если ваш компонент должен взаимодействовать с другими приложениями (например, предоставление данных через ContentProvider, запуск сервиса извне).
  • При использовании Intent Filters с определенными категориями (например, android.intent.category.LAUNCHER), компонент по умолчанию становится exported="true, даже если атрибут явно не указан или установлен в false.

android:exported="false":

  • Компонент доступен только внутри собственного приложения или процессов с тем же user ID.
  • Другие приложения не могут прямо обратиться к этому компоненту.
  • Это значение используется по умолчанию для большинства компонентов с Android 12 (API level 31) и выше, если компонент не имеет intent filters.
  • Использование exported="false" является хорошей практикой с точки зрения безопасности, так как ограничивает потенциальные точки входа для сторонних приложений.
<activity android:name=".MainActivity"
          android:exported="true"> // Эта активити доступна из других приложений
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity android:name=".InternalActivity"
          android:exported="false"> // Эта активити доступна только внутри нашего приложения
</activity>

<service android:name=".DataService"
         android:exported="true"> // Сервис может быть запущен извне
    <intent-filter>
        <action android:name="com.example.myapp.START_DATA_SERVICE" />
    </intent-filter>
</service>

<provider android:name=".MyContentProvider"
          android:authorities="com.example.myapp.provider"
          android:exported="false" // Провайдер доступен только внутри приложения
          android:grantUriPermissions="true"/>