본문 바로가기
Android

[Android] 안드로이드에서 BroadcastReceiver 활용하기: 정적 및 동적 등록과 명시적 vs 암시적 브로드캐스트 전송 이해하기

by quessr 2024. 4. 5.

 

안드로이드에서 BroadcastReceiver를 이용한 명시적 및 암시적 브로드캐스트 전송과 수신에 대해 정리 해 두고자 한다.

BroadcastReceiver 안드로이드에서 중요한 역할을 하는 컴포넌트로, 애플리케이션에서 다양한 시스템 이벤트를 감지하고 반응할 있게 해준다.
정적 동적 등록 방법을 이해하고, 명시적 암시적 브로드캐스트 전송 방법을 알고 있으면 안드로이드 애플리케이션 개발에 있어 효율적으로 BroadcastReceiver 활용할 있다.

BroadcastReceiver란?

BroadcastReceiver는 안드로이드 애플리케이션 구성 요소 중 하나로, 시스템이나 애플리케이션에서 발생하는 다양한 이벤트나 정보를 수신할 수 있는 기능을 제공한다.
예를 들어, 네트워크 상태 변경, 배터리 저전압, 사진 촬영 등의 이벤트를 애플리케이션에서 감지하고 반응할 수 있다.

BroadcastReceiver 등록 방법

 

1. 정적 등록 (AndroidManifest.xml):
애플리케이션의 AndroidManifest.xml 파일에 <receiver> 태그를 사용하여 BroadcastReceiver 선언한다.
방법은 애플리케이션이 실행되지 않고 있을 때도 시스템이 BroadcastReceiver 활성화할 있게 해 준다

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

 

2. 동적 등록 (코드 내): 
registerReceiver() 메서드를 사용하여 실행 시간에 BroadcastReceiver를 등록할  있다.
 방법은 애플리케이션이 활성 상태일 때만 BroadcastReceiver가 동작하도록   유용하다.

MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(myReceiver, filter);

 

명시적 vs 암시적 브로드캐스트

    • 명시적 브로드캐스트:
      특정 컴포넌트(: BroadcastReceiver) 직접 지정하여 브로드캐스트를 전송한다.
      안드로이드 8.0 (API 레벨 26) 이상에서는 백그라운드 실행 제한으로 인해 명시적 브로드캐스트를 선호한다.
      명시적 브로드캐스트의 예시는 다음과 같다.
Intent intent = new Intent(TRIAL_ACTION, MyBroadcastReceiver.class); // MyBroadcastReceiver 클래스가 Action을 받을 수 있도록 명시 돼 있다.
sendBroadcast(intent);

 

    • 암시적 브로드캐스트:
      특정 액션을 지정하고, 액션을 처리할 있는 모든 컴포넌트에 브로드캐스트를 전송한다.
      Android 8.0
      이상에서는 많은 암시적 브로드캐스트가 제한된다.
      암시적 브로드캐스트의 예시는 다음과 같다.
Intent intent = new Intent(TRIAL_ACTION); // 특정한 수신자가 명시되어 있지 않다.
sendBroadcast(intent);

 

명시적 브로드캐스트와 암시적 브로드캐스트의 차이는 다음과 같다.

명시적 브로드캐스트의 경우에는 수신자 리시버 클래스가 명확하게 지정되어 있어, 무조건 지정된 수신자 리시버 클래스가 액션을 받게 된다는 것이고,

암시적 브로드캐스트의 경우에는 특정한 수신자가 명시되지 않고 특정 액션을 필터링하는 어떤 브로드캐스트 리시버든지 액션을 받을 있다는 것이다.

위 코드의 경우 명시적 브로드캐스트에서는 TRIAL_ACTION을 MyBroadcastReceiver가 무조건 받게 되는 것이고,
암시적 브로트캐스트에서는 TRIAL_ACTION을 필터링 하고 있는 경우, 어떤 브로드캐스트 리시버든지 TRIAL_ACTION을 받게 되는 것이다.

 

* 안드로이드 8.0(Oreo) 이상에서는 시스템 리소스의 낭비를 줄이고 배터리 수명을 향상시키기 위해서 암시적 브로드캐스트 제한이 안전한 환경을 위한 조치로 이루어졌다고 한다.

그러나 여전히 일부 상황에서 사용 가능하며, 과거 버전의 안드로이드를 지원하는 애플리케이션의 호환성을 유지하기 위해서도 암시적 브로드캐스트를 이해하고 활용할 필요가 있다.
따라서 안드로이드 애플리케이션 개발을 하는 있어, 암시적 브로드캐스트 방법을 알고 있는 것은 여전히 매우 중요하다.

 


참고 : 
https://developer.android.com/reference/android/content/BroadcastReceiver

 

BroadcastReceiver  |  Android Developers

 

developer.android.com

https://developer.android.com/develop/background-work/background-tasks/broadcasts/broadcast-exceptions