How to use a different launcher activity in a product flavor?
What I have tried:
- Enabling Manifest Merger, which doesn't work;
- Using activity-alias, which doesn't work either.
Finally I found out that the problem could be solved by just adding one line:
<category android:name="android.intent.category.DEFAULT" />
==================================================
To make it clear, I'll go through the problem and solution one more time:
Under src/main/java
there is a MainActivity
, and in corresponding src/main/AndroidManifest.xml
it specifies MainActivity as the launcher activity:
<activity android:name=".MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter></activity>
That is a very easy part. Now we start with the product flavor part.
Due to some reason, in a product flavor, I don't want to overwrite the MainActivity, instead, I have a YetAnotherMainActivity
. The goal is to set the YetAnotherMainActivity
as the new launcher activity in the product flavor, and it should still be able to call MainActivity
.
And here, is how you can set the new activity in product flavor as the new launcher activity:
flavorX/AndroidManifest.xml
:
<activity android:name="com.example.YetAnotherMainActivity" android:label="@string/title_yet_another_main_activity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter></activity>
Yep, it turns out deadly easy. Just add android.intent.category.DEFAULT
.
I think that <activity-alias>
fits there more than any other solution (have no idea why @JingLi couldn't get it working. Maybe there were some troubles year ago, but for now it's okay).
For example, we have the following manifest in main
:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.application"> <application> <activity android:name=".InfoActivity"/> <activity-alias android:name="com.example.application.Launcher" android:targetActivity=".InfoActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity-alias> </application></manifest>
And we want to replace launcher activity with DebugInfoActivity
from debug
flavor. So, we need to just replace the targetActivity
attribute in the specified <activity-alias>
tag:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application> <activity android:name=".DebugInfoActivity"/> <!-- to not litter the manifest --> <activity android:name="com.example.application.InfoActivity" tools:node="remove"/> <activity-alias android:name="com.example.application.Launcher" android:targetActivity=".DebugInfoActivity" tools:replace="android:targetActivity"/> </application></manifest>
Notes:
- In the example we use the same package name for
main
anddebug
. - We have to enter the full name for activity-alias, so the merger can merge their correctly.
With the solution we also can inherit all attributes and childs from main
activity-alias to not duplicate their in debug
.
I guess I am not late :)So today I got the same problem. @seroperson solution was correct but If you do not want the default launcher activity at all then just use the below code in your flavor's manifest:
<activity android:name=".DefaultLauncherActivity" tools:node="remove" >