Skip to content
This repository was archived by the owner on Jul 13, 2026. It is now read-only.

Commit f62cd09

Browse files
authored
Add support to discovering activity-alias activity elements (#247)
Context https://developer.android.com/guide/topics/manifest/activity-alias-element. Fixes https://dev.azure.com/devdiv/DevDiv/_workitems/edit/2305723. So activity-alias allows users to change some settings before calling an activity. The idea is that your activity is no longer the main launcher, you still have that entry, but the activity-alias' become the main launchers. Here is a sample AndroidManifest.xml ```xml <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:allowBackup="true" android:icon="@mipmap/appicon" android:roundIcon="@mipmap/appicon_round" android:supportsRtl="true"> <activity-alias android:name=".MainActivityAlias" android:enabled="true" android:icon="@mipmap/appicon" android:targetActivity=".MainActivity" android:exported="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=".MainActivityAlias2" android:enabled="false" android:icon="@mipmap/appicon2" android:targetActivity=".MainActivity" android:exported="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> </application> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.INTERNET" /> </manifest> ``` The MainActivity.cs then becomes ```csharp [Activity(Theme = "@style/Maui.SplashTheme", LaunchMode = LaunchMode.SingleTop, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] [Register("com.companyname.mauiappwithmultipleicons.MainActivity")] public class MainActivity : MauiAppCompatActivity ``` Note that we do not use the MainLauncher property on the ActivityAttribute.
1 parent 60fae19 commit f62cd09

4 files changed

Lines changed: 12 additions & 3 deletions

File tree

‎src/Xamarin.Android.Tools.AndroidSdk/AndroidAppManifest.cs‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,9 @@ void RemoveAndroidPermissions (IEnumerable<string> permissions)
329329

330330
IEnumerable<XElement>GetLaunchableActivities()
331331
{
332-
foreach(varactivityinapplication.Elements("activity")){
332+
varactivities=application.Elements("activity");
333+
varaliases=application.Elements("activity-alias");
334+
foreach(varactivityinactivities.Union(aliases)){
333335
foreach(varfilterinactivity.Elements("intent-filter")){
334336
foreach(varcategoryinfilter.Elements("category"))
335337
if(category!=null&&(string?)category.Attribute(aName)=="android.intent.category.LAUNCHER")

‎tests/Xamarin.Android.Tools.AndroidSdk-Tests/AndroidAppManifestTests.cs‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ public void GetLaunchableActivityNames ()
5151
varversions=newAndroidVersions(Array.Empty<AndroidVersion>());
5252
varmanifest=AndroidAppManifest.Load(GetTestAppManifest(),versions);
5353
varlaunchers=manifest.GetLaunchableActivityNames().ToList();
54-
Assert.AreEqual(1,launchers.Count);
54+
Assert.AreEqual(2,launchers.Count);
5555
Assert.AreEqual(".HasMultipleIntentFilters",launchers[0]);
56+
Assert.AreEqual(".ActivityAlias",launchers[1]);
5657
}
5758

5859
[Test]

‎tests/Xamarin.Android.Tools.AndroidSdk-Tests/Resources/manifest-simplewidget.xml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@
3333
<categoryandroid:name="android.intent.category.LAUNCHER" />
3434
</intent-filter>
3535
</activity>
36+
<activity-aliasandroid:name=".ActivityAlias"android:label="alias">
37+
<intent-filter>
38+
<actionandroid:name="android.intent.action.MAIN" />
39+
<categoryandroid:name="android.intent.category.LAUNCHER" />
40+
</intent-filter>
41+
</activity-alias>
3642
</application>
3743
<uses-permissionandroid:name="android.permission.INTERNET" />
3844
<uses-permissionandroid:name="android.permission.READ_CONTACTS" />

‎tests/Xamarin.Android.Tools.AndroidSdk-Tests/Xamarin.Android.Tools.AndroidSdk-Tests.csproj‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<!-- $(TargetFrameworks) is used to allow the $(TargetFramework) check in Directory.Build.props to work.
55
If $(TargetFramework) is declared here instead, it will not be evaluated before Directory.Build.props
66
is loaded and the wrong $(TestOutputFullPath) will be used. -->
7-
<TargetFrameworks>net6.0</TargetFrameworks>
7+
<TargetFrameworks>net8.0</TargetFrameworks>
88
<SignAssembly>true</SignAssembly>
99
<AssemblyOriginatorKeyFile>..\..\product.snk</AssemblyOriginatorKeyFile>
1010
<IsPackable>false</IsPackable>

0 commit comments

Comments
 (0)