<aside> ⚠️
안드로이드에서 동적 앱 아이콘 변경시 백그라운드에 무조건 진입 해야 바뀌기 때문에, 앱이 백그라운드에 진입 했을 때를 감지해서 변경하는 방식으로 구현
</aside>
<activity-alias> 를 이용해서 바뀔 컴포넌트를 작성AndroidManifest.xml
<activity-alias
android:name="이름"
android:enabled="false"
android:targetActivity="target 액티비티 이름"
android:icon="아이콘"
android:exported="true">
...
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity-alias>
ex) 여러개의 아이콘을 활용해야 한다면 여러개 작성 후 사용
Application() 을 상속받는 클래스에LifecycleEventObserver 를 구현하여 앱 상태 체크 및 아이콘 변경
Application class
class XX : Application(), LifecycleEventObserver {
override fun onCreate() {
..
// lifecycle observer 등록
ProcessLifecycleOwner.get().lifecycle.addObserver(this)
..
}
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
if (event == Lifecycle.Event.ON_PAUSE) { // 앱 백그라운드 진입 감지
..
val directory = "이름"
val main = "메인 클래스 경로"
val enableIcon = ComponentName(this, "$packageName$directory")
val disableIcon = ComponentName(this, "$packageName$main")
// 기존 아이콘 비활성화
packageManager.setComponentEnabledSetting(disableIcon, PackageManager.COMPONENT_ENABLED_STATE_DISABLED, PackageManager.DONT_KILL_APP);
// 바꿀 아이콘 활성화
packageManager.setComponentEnabledSetting(enableIcon, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP);
}
// lifecycle observer 해제
if (event == Lifecycle.Event.ON_STOP) {
ProcessLifecycleOwner.get().lifecycle.removeObserver(this)
}
}
}
<aside> ‼️
Activity class {com.example.SmapleActivity} does not exist 에러
</aside>
Intent에 추가Intent(this, SampleActivity::class.java).run {
...
val splash = ComponentName(this@Activity, "com.example.SampleActivity")
val splashSub = ComponentName(this@Activity, "com.example.컴포넌트이름")
if ([email protected](splash) == PackageManager.COMPONENT_ENABLED_STATE_DISABLED) {
this.component = splashSub
}
...
this
}.also {
startActivity(it)
}