본문 바로가기
안드로이드 자바

[Java][Android] BroadCast 이벤트 송신, 수신하기

by teamnova 2022. 1. 23.

안녕하세요. 이번시간에는 안드로이드의 4대 컴포넌트중에 하나인 BroadCast Receiver에 대해서 알아보고 간단한 예제를 만들어 보도록 하겠습니다.

 

BroadCast Receiver란?

Android apps can send or receive broadcast messages from the Android system and other Android apps, similar to the publish-subscribe design pattern.

즉 앱이 안드로이드 시스템이나 다른 앱으로 부터 메시지를 받을 수 있으며 그 구조는 '게시-구독' 디자인 패턴과 흡사하다고 합니다. 구체적으로 사용되는 사례로는 충전중이라던가 SNS를 받았다는 등 다양한 이벤트를 구독할 수 있는 겁니다. 또한 기존에 있는 이벤트 뿐만 아니라 자기만의 이벤트를 만들 수도 있으니 사용처는 더욱 다양해지겠죠?

 

구체적인건 아래 공홈을 통해서 확인해보세요.

https://developer.android.com/guide/components/broadcasts

 

브로드캐스트 개요  |  Android 개발자  |  Android Developers

브로드캐스트 개요 Android 앱은 Android 시스템 및 기타 Android 앱에서 게시-구독 디자인 패턴과 유사한 브로드캐스트 메시지를 받거나 보낼 수 있습니다. 관심 있는 이벤트가 발생할 때 이러한 브로

developer.android.com

 

그러면 리시버를 만들어 볼까요?

만드는 과정은 아래 3단계로 이루어집니다.

1. Manifest에 <receiver> 등록

2. BroadCast 수신(시스템)

3. BroadCast 송신 및 수신 (커스텀)

 

1. Manifest에  <receiver> 등록

리시버를 받고자하는 클래스를 만든다면 아래와 같이 메니패스트에 등록하시면 되고 그게 아니라면 생략하셔도 무방합니다. 

<application
    ..
    <receiver
    android:name=".BroadCastReceive를 상속하는 클래스 이름을 넣어주세요."
    android:enabled="true"
    android:exported="true">
    </receiver>
</application>

 

2. BroadCast 수신(시스템)

일반적으로 시스템으로부터 BroadCast 메시지를 받는 다면 받고자 하는 Activity에서 다음과 같이 Broadcast를 생성해주면 됩니다.

	BroadcastReceiver br = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if (intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)) {
                Toast toast = Toast.makeText(context, "Battery status is changed.", Toast.LENGTH_LONG);
                toast.show();
            } else if (intent.getAction().equals(Intent.ACTION_SCREEN_ON)) {
                Toast toast = Toast.makeText(context, "Screen on.", Toast.LENGTH_LONG);
                toast.show();
            } 
        }
    };

 

3. BroadCast 송신 및 수신 (커스텀)

자신만의 BroadCast를 송신하고 수신을하고 싶다면 LocalBroadcastManager를 사용해보도록 합시다. 사용하는 방법은 간단합니다. 송신측과 수신측 코드를 아래와 같이 작성해주면 됩니다.

 

// 사용하고자하는 Activity에서 broadcaster 객체를 생성해줍니다.
LocalBroadcastManager broadcaster;
broadcaster = LocalBroadcastManager.getInstance(this);

// 인텐트 생성시 들어가는 문자열은 키값이 되고 
// 그 안에 데이터를 일반적인 intent에 값을 담듯 넣어주면 됩니다.
Intent intent = new Intent("MyData");
intent.putExtra("phone", "010-0000-1111");
// broadcast 송신
broadcaster.sendBroadcast(intent);

 

수신측에서는 LocalBroadCast를 생명주기에 맞춰 구독 등록 및 해제를 해줘야 합니다. 만약 Activity에서 LocalBraodCast를 듣는다고 했을 때 아래와 같이 작성해주면 됩니다.

    private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            Log.d("Tag", "커스텀 브로드캐스트 실행 받음");
            Toast.makeText(context, intent.getStringExtra("phone"), Toast.LENGTH_LONG).show();
        }
    };

	protected void onStart() {
        super.onStart();
        LocalBroadcastManager.getInstance(this).registerReceiver((mMessageReceiver),
                new IntentFilter("MyData")
        );
    }

    @Override
    protected void onStop() {
        super.onStop();
        LocalBroadcastManager.getInstance(this).unregisterReceiver(mMessageReceiver);
    }

작업 결과물은 아래와 같습니다.