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
https://developer.android.com/guide/components/broadcast-exceptions?hl=ko
https://developer.android.com/about/versions/oreo/background?hl=ko
'IDE & Framework > Android' 카테고리의 다른 글
[Kotlin]local properties에 변수 저장하기 (3) | 2022.01.22 |
---|---|
[Kotlin] Broadcast recevier란? 사용법과 예제 (1) | 2022.01.15 |
[Kotlin] RemoteConfig 적용하기 [간단] (0) | 2022.01.09 |
[Kotlin] Firebase Crashlytics 적용시키기 (간단!) (0) | 2022.01.09 |
[Kotlin] Firebase Crashlytics 적용시키기 (간단!) (0) | 2022.01.09 |