Android_app

[Android App] BroadcastReceiver 간단히 사용해 보기

하니_즐거운하루 2023. 4. 4. 10:48

  : 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 작성시 참고용 파일입니다.

 

오늘도 수고하세요.

반응형