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" />
What's key here is that the aliased name doesn't even have to exist - I could safely delete my old
Launcher class and keep my code pretty. So go forth and stop removing launchers from my home screen!