<aside> ⚠️

안드로이드에서 동적 앱 아이콘 변경시 백그라운드에 무조건 진입 해야 바뀌기 때문에, 앱이 백그라운드에 진입 했을 때를 감지해서 변경하는 방식으로 구현

</aside>

1. <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) 여러개의 아이콘을 활용해야 한다면 여러개 작성 후 사용

2. 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)
		}
	}

}

(2024.12.03 추가)

<aside> ‼️

Activity class {com.example.SmapleActivity} does not exist 에러

</aside>

원인

해결

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)
}