[Android App] BroadcastReceiver 간단히 사용해 보기
: BroadcastReceiver 는 안드로이드 4대 컴퍼넌트중 하나로 기기에서 발생하는
브로드캐스트 정보중 등록된 액션/메시지를 수신하는 컴포넌트 입니다.
▶ Broadcast Receiver 클래스 생성 방법
: File 메뉴 ==> New ==> Other ==> Broadcast Receiver 선택
▶ 수정및 생성된파일
↓ AndroidManifest.xml에 자동으로 수정된 사항
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
</receiver>
↓ MyReceiver.kt 자동 생성된 내용
class MyReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
// This method is called when the BroadcastReceiver is receiving an Intent broadcast.
TODO("MyReceiver.onReceive() is not implemented")
}
}
1> 위에서 만든 MyReceiver 의 onReceive() 에서 메시지 받는 방법에는 2가지 입니다.
: AndroidMainfest.xml 수정하기 또는 소스코드에서 registerReceiver() 호출하기
1-1> AndroidManifest.xml 파일에 intent-filter 추가해 등록하는 방법
▶ BOOT_COMPLETED 메시지 받는 경우에 대한 처리사항
↓ AndroidManifest.xml 수정사항
<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
↓ MyReceiver.kt 수정사항 (메시지 Logcat 으로 출력되게 작성)
override fun onReceive(context: Context, intent: Intent) {
StringBuilder().apply {
append("Action: ${intent.action}\n")
append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
toString().also { log -> Log.d(TAG, log) }
}
}
↓ 부팅시 Logcat 을 보니 아래처럼 에러가 나오네요. (퍼미션을 추가해야 한다고 나오네요.)
BroadcastQueue system_server W Permission Denial: receiving Intent
{ act=android.intent.action.BOOT_COMPLETED flg=0x89000010 (has extras) }
to com.example.test_app/.MyReceiver requires android.permission.RECEIVE_BOOT_COMPLETED
due to sender null (uid 1000)
↓ AndroidManifest.xml 에 아래의 퍼미션을 추가해 줍니다.
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
↓ 설정 ==> 어플리케이션 에 들어간후 설치된 어플리케이션 권한 중 아래의 권한 허용해 줍니다.
↓ 장치를 재시작 해주면 아래처럼 logcat 이 정상적으로 출력됩니다.
ActivityManager system_server I Start proc 12540:com.example.test_app/u0a517 for broadcast {com.example.test_app/com.example.test_app.MyReceiver}
-------- PROCESS STARTED (12540) for package com.example.test_app ----------------------------
com.exampl...MyReceiver com.example.test_app D Action: android.intent.action.BOOT_COMPLETED
URI: intent:#Intent;action=android.intent.action.BOOT_COMPLETED;launchFlags=0x89000010;component=com.example.test_app/.MyReceiver;i.android.intent.extra.user_handle=0;end
↓ 아래처럼 도움말 메시지를 잘 읽고 한번에 수정하면 더 빠르겠죠.
1-2> 소스 파일에서 Broadcast Receiver 등록하는 방법
: 일부 액션의 경우 소스파일의 registerReceiver() 함수를 사용해 등록해야 동작하는 경우도 있습니다.
총 4가지의 오버라이드 메서드가 존재합니다.
registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler, int flags)
registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter, @Nullable String broadcastPermission, @Nullable Handler scheduler)
registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter, int flags)
registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter)
▶ TIME_TICK 등록하기 : 현재시간기준 매분마다 변경될때 메시지를 수신합니다. (초가 아닌 분단위)
: 잘 보시면 Androidmainfest.xml 에 선언만으로 동작하지 않는다고 적혀 있습니다.
↓ 아래의 registerReceiver() 함수를 사용해 TIME_TICK 등록및 동작을 확인해 보겠습니다.
↓ 인자에 사용되는 BroadcastReceiver 와 IntentFilter 만 넣고 호출해주면 끝입니다.
// 1> BroadcastReceiver 변수 설정하기
val br:BroadcastReceiver =MyReceiver()
// 2> IntentFilter 변수 설정하기
val intentFilter: IntentFilter = IntentFilter()
intentFilter.addAction("android.intent.action.TIME_TICK")
or
val intentFilter: IntentFilter = IntentFilter("android.intent.action.TIME_TICK")
or
val intentFilter: IntentFilter = IntentFilter(Intent.ACTION_TIME_TICK)
// 3> registerReceiver 함수 호출하기
registerReceiver(br,intentFilter)
↓ AndroidManifest.xml 에 Intent-filter는 넣을 필요 없습니다.
↓ registerReceiver(...) 함수 호출후 logcat 메시지
>> 현재시간의 분이 변경 될때마다 TIME_TICK 메시지를 수신합니다.
Action: android.intent.action.TIME_TICK
URI: intent:#Intent;action=android.intent.action.TIME_TICK;launchFlags=0x50200010;end
Action: android.intent.action.TIME_TICK
URI: intent:#Intent;action=android.intent.action.TIME_TICK;launchFlags=0x50200010;end
Action: android.intent.action.TIME_TICK
URI: intent:#Intent;action=android.intent.action.TIME_TICK;launchFlags=0x50200010;end
Action: android.intent.action.TIME_TICK
URI: intent:#Intent;action=android.intent.action.TIME_TICK;launchFlags=0x50200010;end
Action: android.intent.action.TIME_TICK
URI: intent:#Intent;action=android.intent.action.TIME_TICK;launchFlags=0x50200010;end
Action: android.intent.action.TIME_TICK
URI: intent:#Intent;action=android.intent.action.TIME_TICK;launchFlags=0x50200010;end
간단히 Broadcast Receiver() 생성및 사용법을 알아봤습니다.
<기타 >
▶ broadcast 메시지 전송및 수신하기
1> Broadcast 메시지 송신부
val intent = Intent("com.example.test.ACTION_GATT_CONNECTED")
sendBroadcast(intent)
2> Broadcast 메시지 수신부 등록코드
val filter = IntentFilter()
filter.addAction("com.example.test.ACTION_GATT_CONNECTED")
registerReceiver(mGattUpdateReceiver,filter)
3> BroadcastReceiver 객체생성
private val mGattUpdateReceiver = object :BroadcastReceiver() {
override fun onReceive(p0: Context?, p1: Intent?) {
val action =p1!!.action
when(action){
"com.example.test.ACTION_GATT_CONNECTED" -> {
Log.d(TAG, "received ACTION_GATT_CONNECTED")
}
}
}
}
추후 Broadcast Receiver 작성시 참고용 파일입니다.
오늘도 수고하세요.