IDE & Framework/Android

[Kotlin] Broadcast 란? 사용법과 예제

Greensky0026 2022. 1. 15. 20:41
반응형

Broadcast란?

 Android Application이나 Android System에서 Publish-subscribe pattern처럼 이벤트를 송/수신 하는 컴포넌트입니다.

이벤트는 intent객체에 담겨서 발송되게 됩니다.

Broadcast의 intent 뜯어보기

 이벤트는 intent에 문자열로 담겨서 전송되며, 구조는 아래와 같습니다.

//android.intent.action.PACKAGE_FULLY_REMOVED이벤트 broadcast의 intent
Intent { 
    act=android.intent.action.PACKAGE_FULLY_REMOVED 
    dat=package:com.example.broadcasttestc 
    flg=0x5000010
    cmp=com.example.broadcasttesta/.MyBroadcastReceiver (has extras) 
}

그리고 이는 아래처럼 호출하여 문자열로 획득할 수 있습니다.

intent.action
intent.data
intent.flags
intent.component

action은 브로드캐스트의 이벤트 이름으로써, 수신기가 action을 intent-filter에 입력하여 수신할 수 있습니다.

data는 uri type으로 파싱된 문자열입니다. 보통 Android System Broadcast들은 data에 발송지가 적혀 있습니다.

여기에 더불어서 intet에 직접 putExtra()를 사용해 본인이 추가로 데이터를 더 싣을 수 있고, flag를 추가할수도 있습니다.

 

Braodcast 발송하기

 Android System broadcast는 직접 발송할 수 없습니다.

그리고 직접 발송하는 broadcast는 명시적 브로드캐스트와 암시적브로드캐스트 두 종류로 나눌 수 있습니다.

참고로, 목적지의 패키지/클래스명을 component 속성에 담아 발송하면 명시적 인텐트,

목적지 없이 보내는 것을 암시적 인텐트라 합니다. 이 둘의 차이는 아래에서 설명드리겠습니다.

 

보내는 방법

 보통은 모든 수신자에게 한번에 보내는 sendBroadcast()를 많이 사용하는데,

한 수신자에게만 전달하는 sendOrderBroadcast(),

앱 내부에만 발송하는 LocalBroadcastManager.sendBroadcast()도 있습니다.

 

명시적 브로드캐스트 발송

Intent().also { intent ->
    intent.action = "com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB"
    intent.component = ComponentName("com.example.broadcasttestb", "com.example.broadcasttestb.MyBroadcastReceiver")
    intent.putExtra("onNewTokenMillis", System.currentTimeMillis().toString())
    intent.data = (Uri.parse("package:${this.packageName}"))
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    sendBroadcast(intent)
}

com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB 이라는 이벤트를

com.example.broadcasttestb 패키지의 com.example.broadcasttestb.MyBroadcastReceiver 클래스로

"package:${this.packageName}"을 intent.data에 담고,

"onNewTokenMillis"라는 이름의 key에 System.currentTimeMillis().toString()란 value를 담아

addFlags로 앱이 죽어있다면 깨우는 Intent.FLAG_INCLUDE_STOPPED_PACKAGES 플래그도 추가해

Broadcast를 발송하는 코드입니다.

 

암시적 브로드캐스트 발송

Intent().also { intent ->
    intent.action = "com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB"
    intent.putExtra("onNewTokenMillis", System.currentTimeMillis().toString())
    intent.data = (Uri.parse("package:${this.packageName}"))
    intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
    sendBroadcast(intent)
}

com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB 이라는 이벤트에

"package:${this.packageName}"을 intent.data에 담고,

"onNewTokenMillis"라는 이름의 key에 System.currentTimeMillis().toString()란 value를 담아

addFlags로 앱이 죽어있다면 깨우는 Intent.FLAG_INCLUDE_STOPPED_PACKAGES 플래그도 추가해

Broadcast를 발송하는 코드입니다.

 

 

글이 길어져서, Broadcast를 수신하는 BroadcastReceiver는 다음 글에서 설명하도록 하겠습니다.

Broadcast recevier란? 사용법과 예제 - https://greensky0026.tistory.com/218


참고 사이트

https://developer.android.com/guide/components/broadcasts?hl=ko 

 

브로드캐스트 개요  |  Android 개발자  |  Android Developers

브로드캐스트 개요 Android 앱은 Android 시스템 및 기타 Android 앱에서 게시-구독 디자인 패턴과 유사한 브로드캐스트 메시지를 받거나 보낼 수 있습니다. 관심 있는 이벤트가 발생할 때 이러한 브로

developer.android.com

https://developer.android.com/guide/components/broadcast-exceptions?hl=ko 

 

암시적 브로드캐스트 예외  |  Android 개발자  |  Android Developers

백그라운드 제한에서 제외되는 암시적 브로드캐스트입니다.

developer.android.com

https://developer.android.com/about/versions/oreo/background?hl=ko 

 

백그라운드 실행 제한  |  Android 개발자  |  Android Developers

Android 8.0 이상을 대상으로 하는 앱에 대한 새로운 백그라운드 제한.

developer.android.com

 

반응형