
activity-alias – это элемент манифеста, который позволяет создать дополнительную точку входа в уже существующую Activity. У alias может быть свой label, icon, roundIcon, enabled и свой intent-filter. Поэтому через несколько activity-alias можно сделать несколько launcher-иконок для одного приложения и переключать их во время работы.
Обычная launcher-точка входа выглядит так:
<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>
Но если нужно менять иконку, launcher intent лучше перенести из activity в activity-alias. Тогда MainActivity остается без launcher-фильтра, а наружу публикуются alias-компоненты:
<activity
android:name=".MainActivity" />
<activity-alias
android:name=".DEFAULT"
android:targetActivity=".MainActivity"
android:exported="true"
android:icon="@drawable/ic_launcher"
android:roundIcon="@drawable/ic_launcher"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
Launcher видит не MainActivity, а включенный alias. Когда пользователь нажимает на иконку, Android все равно открывает MainActivity, потому что alias указывает на нее через android:targetActivity.
В ресурсах лежат три adaptive icon:
ic_launcher.xml
ic_launcher_premium.xml
ic_launcher_xmas.xml
И отдельные слои для превью в UI:
ic_launcher_background.xml
ic_launcher_foreground.xml
ic_launcher_background_premium.xml
ic_launcher_foreground_premium.xml
ic_launcher_background_xmas.xml
ic_launcher_foreground_xmas.xml
В манифесте объявлены три alias-компонента:
<activity-alias
android:name=".DEFAULT"
android:targetActivity=".MainActivity"
android:exported="true"
android:icon="@drawable/ic_launcher"
android:roundIcon="@drawable/ic_launcher"
android:enabled="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name=".PREMIUM"
android:targetActivity=".MainActivity"
android:exported="true"
android:icon="@drawable/ic_launcher_premium"
android:roundIcon="@drawable/ic_launcher_premium"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
<activity-alias
android:name=".XMAS"
android:targetActivity=".MainActivity"
android:exported="true"
android:icon="@drawable/ic_launcher_xmas"
android:roundIcon="@drawable/ic_launcher_xmas"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
По умолчанию включен только .DEFAULT, остальные выключены. Это важное правило: в launcher должен быть активен один alias. Если включить несколько, пользователь увидит несколько иконок одного приложения. Если выключить все, приложение исчезнет из launcher. Alias должен ссылаться на уже объявленную activity, поэтому MainActivity в манифесте размещают перед activity-alias. Так как у alias есть launcher intent-filter, него обязательно должен быть указан android:exported.