When you deploy your Android app, the launcher Activity's manifest entry should be treated as a contract. While it is possible to change the launcher after install doing so will confuse apps that previously used the contract. The classic example is putting a launcher on your home screen only to have it disappear after an app update. I'm getting a bit annoyed at how often this problem arises because it's perfectly avoidable!

I assume the reason this happens is because developers want to improve their code's organization (by changing package/class names) which is a noble goal. That said, it is entirely possible to reorganize without changing your launcher's manifest contract, thus preserving users' home screens.

The solution is using <activity-alias> in AndroidManifest.xml. It acts a lot like <activity> , except instead of launching an Activity it lets you route an Intent aimed at one android:name towards another.

Suppose this is what's currently in my manifest:

<activity android:name=".Launcher" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>

Here I move and rename my Activity but still preserve the old launcher contract:

<activity-alias android:name=".Launcher" android:targetActivity=".ui.MyNewLauncher" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity-alias> <activity android:name=".ui.MyNewLauncher" />