공부/안드로이드

[안드로이드] 브로드캐스트 리시버(BroadcastReceiver)

ghhong 2021. 9. 10. 14:23

브로드캐스트. 네트워크 수업에서 배웠듯이 불특정 다수에게 송신하는 것이다.

안드로이드에서는 특정 요소에게만 송신하는 경우도 있다.

브로드캐스트 리시버는 이러한 신호를 receive하는 것이다.

안드로이드의 receiver는 기기의 상태 변화나 다른 앱이 송신하는 신호들을 받아서 처리한다.

예를 들면 기기를 충전기에 꽂았다 하면 충전중이라는 신호를 받을 수 있다. 

 

브로드캐스트 수신하기

manifest에 선언된 리시버

manifest에 broadcast receiver를 선언하면 브로드캐스트가 전송될 때 앱이 아직 실행중이 아니라면 시스템에서 앱을 실행합니다.

 

1. 앱의 menifest에서 <receiver> 요소를 지정합니다.

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

인텐트 필터는 리시버가 subscribe할 브로드캐스트 작업을 지정합니다.

 

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

   다음 예의 broadcast receiver는 브로드캐스트의 콘텐츠를 기록하고 표시합니다.

public class MyBroadcastReceiver extends BroadcastReceiver {
  private static final String TAG = "MyBroadcastReceiver";
  @Override
  public void onReceive(Context context, Intent intent) {
    StringBuilder sb = new StringBuilder();
    sb.append("Action: " + intent.getAction() + "\n");
    sb.append("URI: " + intent.toUri(Intent.URI_INTENT_SCHEME).toString() + "\n");
    String log = sb.toString();
    Log.d(TAG, log);
    Toast.makeText(context, log, Toast.LENGTH_LONG).show();
  }
}

앱이 설치될 때 시스템이 수신자를 등록합니다. 그러면 수신자가 앱으로 향하는 별도의 진입점이 됩니다. 앱이 현재 실행되고 있지 않으면 시스템이 앱을 시작하고 브로드캐스트를 전달할 수 있습니다.

 

컨텍스트에 선언된 리시버

1. BroadcastReceiver 인스턴스를 생성합니다.

BroadcastReceiver br = new MyBroadcastReceiver();

2. 인텐트필터를 생성하고 registerReceiver(BroadcastReceiver, IntentFilter)를 호출하여 리시버를 등록합니다.

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

3. 브로드캐스트 수신을 중지하려면 unregisterReceiver(android.content.BroadcastReceiver)를 호출합니다. 수신자가 더 이상 필요하지 않거나 컨텍스트가 더 이상 유효하지 않으면 수신자의 등록을 취소해야 합니다.

※ onCreate에서 등록했으면 onDestroy에서 등록 취소, onResume에서 등록했으면 onPause에서 등록 취소해야한다.

※ BroadcastReceiver가 실행중인 프로세스는 포그라운드 프로세스로 간주되어 시스템으로부터 종료될 가능성이 적습니다. receiver가 onReceive()에서 반환되면 BroadcastReceiver는 더 이상 active하지 않으므로 다른 더 중요한 프로세스에서 리소스를 사용할 수 있도록 시스템으로하여금 종료될 수 있습니다. 따라서 broadcast receiver에서 장기 실행 백그라운드 스레드를 시작해서는 안 됩니다.

 

브로드캐스트 전송하기

1. sendOrderedBroadcast(Intent, String):

한 번에 하나의 수신자에 브로드캐스트를 전송합니다. 각 수신자는 차례로 실행되기 때문에 결과를 다음 수신자로 전파하거나 브로드캐스트를 완전히 중단하여 브로드캐스트가 다른 수신자로 전달되지 않도록 할 수 있습니다. 수신자가 실행되는 순서는 일치하는 인텐트필터의 android:priority 속성으로 제어할 수 있습니다. 우선순위가 동일한 수신자는 임의의 순서로 실행됩니다.

 

2. sendBroadcast(Intent):

정의되지 않은 순서로 모든 수신자에 브로드캐스트를 전송합니다. 이를 일반 브로드캐스트라고 합니다. 일반 브로드캐스트는 상당히 효율적이지만 수신자가 다른 수신자의 결과를 읽거나 브로드캐스트로부터 수신한 데이터를 전파하거나 브로드캐스트를 중단할 수 없습니다.

 

3. LocalBroadcastManager.sendBroadcast:

발신자와 동일한 앱에 있는 수신자에 브로드캐스트를 전송합니다. 앱 간에 브로드캐스트를 전송할 필요가 없다면 로컬 브로드캐스트를 사용합니다. 구현이 효율적이고 다른 앱이 브로드캐스트를 수신하거나 전송할수 있는 부분에 관련된 보안 문제에 관해 걱정할 필요가 없다.

 

sendBroadcast(Intent) 예시

Intent intent = new Intent();
intent.setAction("com.example.broadcast.MY_NOTIFICATION");
intent.putExtra("data","Notice me senpai!");
sendBroadcast(intent);

인텐트에 액션과 엑스트라정보를 추가하여 브로드캐스트 전송

 

 

출처 : 

https://developer.android.com/guide/components/broadcasts?hl=ko#effects-process-state 

 

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

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

developer.android.com

https://brunch.co.kr/@mystoryg/48

 

브로드캐스트 리시버 (BroadcastReceiver)

4대 컴포넌트 | 브로드캐스트 리시버  (BroadcastReceiver) 브로드캐스트는 단어 그대로 방송을 하는 것이다. 방송의 특징을 생각해보면 방송국은 불특정 다수에게 송신을 하고 필요한 사람은 수신하

brunch.co.kr