Broadcast recevier란?
말그대로 Broadcast를 받는 수신기라고 생각하시면 됩니다.
Manifest에 수신기를 선언하거나, Context에 수신기를 구현하는 두가지 방법이 존재합니다.
안드로이드 백그라운드 정책 강화로 API 26부터 기존에 비해 수신기 구현이 어려워졌습니다.
수신대상의 패키지, 클래스명을 입력하는 명시적 브로드캐스트나, 몇가지의 암시적 브로드캐스트 예외(링크)를 제외하고는 모두 Context에 직접 수신기를 구현해야 합니다.
- Manifest / Context 수신기 등록 차이
Manifest에 등록시
- 앱이 실행중이 아니여도 이벤트를 수신하고 작업을 처리할 수 있습니다.
Context에 등록시
- 앱이 실행중이여야 이벤트를 수신하고 작업을 처리할 수 있습니다.
수신기 등록하기
1. Manifest에 등록
<application>
//...
<receiver android:name="com.example.broadcastlibtestb.MyBroadcastReceiver" android:exported="true">
<intent-filter>
<action android:name="com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB"/> //1
<action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> //2
<action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> //3
<data android:scheme="package" /> //4
</intent-filter>
</receiver>
//...
</application>
Manifest의 application 태그 안에 recevier 태그를 입력해서 수신기를 등록합니다.
android:name에는 broadcast recevier를 구현한 클래스명을 입력하고,
android:exported="true"로 입력함으로써 외부에서의 호출을 허용합니다.
recevier 태크 안에 intent-filer로 구독할 Action명을 입력하면 해당 이벤트를 수신할수 있습니다.
1번은 직접 만든 이벤트이고, 2,3번은 Android System에서 발송하는 브로드캐스트 action입니다.
참고로, Android System broadcast를 받으려면 4번을 입력해둬야 합니다.
2.Context에 등록
val reciver = MyBroadcstReceiver
intentFilter = IntentFilter()
intentFilter.addAction("com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB")
intentFilter.addAction("android.intent.action.PACKAGE_FULLY_REMOVED")
intentFilter.addAction("android.intent.action.PACKAGE_DATA_CLEARED")
registerRecevier(receiver, intentFilter) //등록
//unregisterReveiver(receiver) //해제
Context에서 제공하는 registerRecevier()를 사용해서 등록하는 방법입니다.
Broadcast receiver 구현
구현은 어렵지 않습니다. BroadcastReceiver()를 상속받는 클래스를 생성하면 됩니다.
MyBroadcastReceiver.kt
class MyBroadcastReceiver : BroadcastReceiver(){
override fun onReceive(context: Context?, intent: Intent?) {
StringBuilder().apply {
if (intent == null) {
return
}
append("Action: ${intent.action}\n")
append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
toString().also { log ->
Log.d(TAG, "$log intent:$intent")
}
}
}
}
메세지 받은 결과
2022-01-12 15:05:45.155 23603-23603/com.example.broadcasttesta D/MyBroadcastReceiver: Action: android.intent.action.PACKAGE_FULLY_REMOVED
URI: intent:com.example.broadcasttestc#Intent;scheme=package;action=android.intent.action.PACKAGE_FULLY_REMOVED;launchFlags=0x5000010;component=com.example.broadcasttesta/.MyBroadcastReceiver;B.android.intent.extra.REMOVED_FOR_ALL_USERS=true;B.android.intent.extra.DONT_KILL_APP=false;i.android.intent.extra.UID=10316;B.android.intent.extra.DATA_REMOVED=true;i.android.intent.extra.user_handle=0;end
intent:Intent { act=android.intent.action.PACKAGE_FULLY_REMOVED dat=package:com.example.broadcasttestc flg=0x5000010 cmp=com.example.broadcasttesta/.MyBroadcastReceiver (has extras) }
후기
확실히 공부만 하는것과 써보는것이 이해의 차이가 아주 큰 것 같습니다.
클린코드에서 학습단위를 작은것부터 반복적으로 하면 아주 효과적이라고 했듯이 말이죠.
모두들 즐거운 코딩 되시길!
참고 사이트
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' 카테고리의 다른 글
Android Background Service 작업 제한 (1) | 2022.01.22 |
---|---|
[Kotlin]local properties에 변수 저장하기 (3) | 2022.01.22 |
[Kotlin] Broadcast 란? 사용법과 예제 (0) | 2022.01.15 |
[Kotlin] RemoteConfig 적용하기 [간단] (0) | 2022.01.09 |
[Kotlin] Firebase Crashlytics 적용시키기 (간단!) (0) | 2022.01.09 |