안드로이드/이론
[ 안드로이드 ] LocalBroadcaseManager Deprecated 대응
dongx._.2
2024. 7. 12. 10:56
Deprecated 된 이유
LocalBroadcastReceiver를 사용하는 것이 레이어 위반을 유발할 수 있다고함
Livedata나 반응형 스트림 (Flow) 등을 사용할 것을 권장
LocalBroadcastManager 대체 방법
Event를 전송하기 위한 수단으로 SharedFlow를 Object 클래스로 선언하여 사용
object ExamEventFlow {
private val _eventFlow = MutableSharedFlow<String?>(
extraBufferCapacity = 1,
onBufferOverflow = BufferOverflow.DROP_OLDEST
)
val eventFlow: SharedFlow<String?> get() = _eventFlow
suspend fun sendEvent(data: String?) {
_eventFlow.emit(data)
}
}
SharedFlow를 Object 클래스로 사용하고 있으므로 메모리 이슈가 있을 수 있음
Reply는 0, Buffer의 크기는 1로 지정하여 Event를 흘려보내는 역할로만 동작하도록 함
class ExampleBroadcastReceiver : BroadcastReceiver() {
companion object {
private const val EXAMPLE_ACTION = "com.example.example.CASHBACK_PAGE_OPENED"
}
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action != EXAMPLE_ACTION) return
val data = intent.getStringExtra("data")
CoroutineScope(Dispatchers.Default).launch {
ExamEventFlow.sendEvent(data)
}
}
}
이벤트 수신
private val job = Job()
private val coroutineScope = CoroutineScope(Dispatchers.Default + job)
private fun subscribeToEventFlow() {
coroutineScope.launch {
ExamEventFlow.eventFlow.collect { data ->
/* ... */
}
}
}
주의점
전역적으로 이벤트를 전달하는 역할을 하므로, Lifecycle에 주의 해야함
Service에서 사용한다면 onCreate 시점에 구독, onDestory 시점에 job.cancel() 시켜주도록 해야함
Activity, Fragment에서 사용한다면 Lifecycle에 따라 수신할 수 있도록 해야함