Thanks to Mike M.
I found a workaround to change an icon without closing the app. All you need to create another config activity and set main activity's launch mode to single instance.
<activity
android:name=".config.ConfigActivity"
android:exported="true"
android:enabled="true"
android:icon="@mipmap/ic_light"
android:screenOrientation="sensorPortrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".MainActivity"
android:exported="true"
android:enabled="false"
android:icon="@mipmap/ic_light_round"
android:launchMode="singleInstance"
android:screenOrientation="sensorPortrait"
tools:ignore="DiscouragedApi,LockedOrientationActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity-alias
android:name=".MainActivityDark"
android:exported="true"
android:enabled="false"
android:icon="@mipmap/ic_dark_round"
android:targetActivity=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity-alias>
After this you have to do some manipulations:
· Enable main activity in onCreate() and start it with some extra - Boolean:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
this.enableMainActivity()
startActivity(
Intent(this, MainActivity::class.java).apply {
putExtra("is_config", true)
}
)
}
· Disable config activity in onCreate():
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val isConfigNeeded = intent.getBooleanExtra("is_config", false)
if (isConfigNeeded) {
disableConfigActivity()
}
// UI
}
App will start closing, but don't worry. The only one step is ahead:
· Start main activity in config activity's onDestroy():
override fun onDestroy() {
super.onDestroy()
startActivity(Intent(this, MainActivity::class.java))
}
Thank you for the attention! Github repo: xo-tymoshenko/iconchange