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에 따라 수신할 수 있도록 해야함
'안드로이드 > 이론' 카테고리의 다른 글
[ 안드로이드 ] APK/AAB 추출 시 파일명 변경하기 + 성능 최적화 (1) | 2024.12.08 |
---|---|
[ 안드로이드 ] Kotlin-Serialization 옵션 정리 (2) | 2024.10.04 |
[ 안드로이드 ] 앱 내에 개발자 모드 추가하기 3 (0) | 2024.05.16 |
[ 안드로이드 ] 액티비티 배경 투명하게 설정 (+ 투명 배경 유지 안되는 이슈 해결) (0) | 2024.03.25 |
[ 안드로이드 ] Multi ViewType RecyclerView ViewHolder 순서 고정하기 (0) | 2024.01.14 |