ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Android] 브로드캐스트 리시버(Broadcast Receiver)와 전송
    Android 2021. 4. 8. 16:19
    반응형

     

    브로드캐스트

    안드로이드는 기기 충전 시작, SMS수신과 같은 이벤트가 발생하면 브로드캐스트 메시지를 전송하여 앱에 알릴 수 있다.

    앱은 특정 브로드캐스트를 수신하도록 등록할 수 있고,

    브로드 캐스트가 전송되면 그 유형의 알림을 수신하도록 등록한 앱에 자동으로 라우팅하게 된다.

     

    한마디로 이벤트 발생을 알리는 메시징 시스템 !!

     

     

    브로드캐스트 리시버

    앱에서 브로드캐스트 알림을 수신하기 위해서는 브로드캐스트 리시버(Broadcast Receiver)를 구현해야 한다.

     

    브로드캐스트 리시버 구현

    BroadcastReceiver의 서브 클래스를 선언하고, onReceive(Context, Intent)를 구현한다.

    onReceive 메서드는 지정한 브로드캐스트 메시지가 도착하면 자동으로 호출된다.

    public class MyBroadcastReceiver extends BroadcastReceiver { 
    
        @Override 
        public void onReceive(Context context, Intent intent) { 
    		//... 
        } 
     }
        

    파라미터로 전달되는 인텐트 객체 안에 이벤트 관련 데이터가 들어 있고, 인텐트 내부 Bundle 객체를 통해 참조할 수 있다.

     

    (정적 등록) manifest 등록 및 수신 이벤트 지정

    브로드캐스트 리시버도 앱 구성요소이기 때문에 manifest파일에 등록해야한다.

    그리고 모든 메시지는 인텐트 안에 넣어 전달되므로 구독할 브로드캐스트 메시지를 인텐트 필터를 이용해 지정한다.

    <receiver 
    	android:name=".MyBroadcastReceiver" 
        android:exported="true"> 
       	
        <intent-filter> 
        	<action android:name="android.provider.Telephony.SMS_RECEIVED"/> 
        </intent-filter> 
    </receiver>

     

    (동적 등록) context 등록 및 수신 이벤트 지정

    manifest에 등록하는 방법 외에도 액티비티에서 직접 리시버 객체를 생성하여 컨텍스트에 등록할 수 있다.

    인텐트 필터 객체를 생성하여 동일하게 수신할 메시지를 지정할 수 있다.

    BroadcastReceiver br = new MyBroadcastReceiver(); 
    IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION); 
    filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
    this.registerReceiver(br, filter);

     

    컨텍스트에 등록된 리시버는 등록 컨텍스트가 유효한 동안만 브로드캐스트를 수신한다.

    예를 들어 액티비티의 컨텍스트 내에 등록하면 액티비티가 소멸할 때까지 브로드캐스트를 수신하고,

    어플리케이션 컨텍스트에 등록하면 앱이 실행하는 동안 수신한다.

     

    수신자 등록시 불필요한 오버헤드를 줄이기 위해서 등록 해제를 반드시 해야한다.

    unregisterReceiver(br); 
    //br은 해지하려는 BroadcastReceiver객체

    주로 onCreate()에서 등록했다면 onDestroy()에서, onResume()에서 등록했다면 onPause()에서 해제한다.

     

    브로드캐스트 전송

    안드로이드는 앱에서 브로드캐스트를 전송하는 방법을 세 가지 제공한다.

    sendOrderedBroadcast

    sendOrderedBroadcast() 메서드는 한 번에 하나의 리시버에게 브로드캐스트를 전송하는데,

    인텐트 필터의 android:priority를 이용해 순서대로 전송한다.

     

    차례로 전달되기 때문에 전달 속도가 느리지만, 전파하거나 전파를 중지하는 등 전송을 제어할 수 있다.

    sendBroadcast

    sendBroadcast() 메서드는 일반 브로드캐스트 방식인데, 모든 수신자에게 브로드캐스트를 동시에 전송한다.

    동시에 전송하기 때문에 전송 속도는 빠르지만 중단하거나 순서를 지정하는 등 전송을 제어할 수는 없다.

    LocalBroadcastManager.sendBroadcast

    LocalBroadcastManager.sendBroadcast() 메서드는 동일한 앱에 있는 수신자에 브로드캐스트룰 전송한다.

    앱 내부에서 전송하는 경우에는 프로세스간 통신이 필요 없고 보안 측면에서도 효율적이다.

    댓글