[Android] BroadCastReceiver 사용해보기

Android BroadCastReceiver Sample

Posted by JungHoon-Park on June 15, 2019

Android BroadCastReceiver 사용해보기


BroadCastReceiver 란

- 4대 컴포넌트 중 하나이다
- 각종 앱에서 발생하는 방송(이벤트)을 캐치 후 리시버로 처리할 수 있도록 해준다
- 방송하기 -> 수신하기 » 두 개가 하나의 사이클로 동작된다.
- 정적리시버 와 동적리시버 두가지 종류가 있다.

정적리시버 사용

  • 한번 등록되면 해제할 수 없다.
  • Manifest에 리시버를 등록하는 방식으로 정적리시버를 등록한다.
  • 해당 앱이 설치될 때 자동으로 등록된다.

1.BroadcastReceiver를 상속받는 클래스 생성 new -> other -> Broadcast Receiver로 만들면 됨

1
2
3
4
5
6
7
public class BatteryReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        Toast.makeText(context, "받은 Action-> ", Toast.LENGTH_SHORT).show();
    }
}

2.AndriodManifest.xml에 intent-filter 등록

1
2
3
4
5
6
7
8
<receiver
    android:name=".broadcastreceiver.BatteryReceiver"
    android:enabled="true"
    android:exported="true">
        <intent-filter>  <!--오래오 이전버전에서는 이렇게 해야됨-->
                <action android:name="android.intent.action.ACTION_POWER_CONNECTED"/>
        </intent-filter>
</receiver>

3.테스트해보기

1
2
3
4
5
6
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    sendBroadcast(new Intent(Intent.ACTION_POWER_CONNECTED));
}

전원이 연결되면 BatteryReceiver 가 방송을 캐치하여 Toast 메시지가 동작한다.

동적리시버 사용

동적등록은 안드로이드의 Context가 유효할동안 동작한다. 즉 ActivityContextBroadcatReceiver를 등록한다면 ActivityDestroy될 때까지 Receiver는 유효하다. 등록은 Context에서 제공하는 registerReceiver()를 사용해서 등록한다.
메시지를 수신할 때는 등록된 ReceiveronReceive() 메서드에서 수신 가능하다. BroadCastReceiver가 더이상 필요하지 않을 경우 unregisterReceiver()메서드로 등록을 해제해야한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@Override
protected void onResume() {
    super.onResume();
    //BroadCastReceiver 에 Action 등록
    batteryReceiver = new BatteryReceiver();
    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(Intent.ACTION_POWER_CONNECTED);
    intentFilter.addAction(Intent.ACTION_POWER_DISCONNECTED);
    this.registerReceiver(batteryReceiver,intentFilter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(batteryReceiver);
}