안드로이드/이론

[ 안드로이드 ] 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에 따라 수신할 수 있도록 해야함