[Components] Broadcast Receiver

greenddoovie·2021년 12월 11일
0

안드로이드

목록 보기
3/8

Broadcast Receiver

Android 앱은 Publish-Subscribe 디자인 패턴과 유사하게 작동하는 브로드캐스트 메시지를 받거나 보낼 수 있다. Android 시스템에 broadcast를 보낼 수도 있고 시스템을 통해 broadcast를 받을 수 있다. 그리고 이러한 이벤트는 시스템에 정의되어 있는 것도 있고 앱에서 만들어 보낼 수 있다.

수신

Android App은 특정 브로드캐스트를 수신하도록 등록할 수 있다. 시스템은 특정 유형의 브로드캐스트를 수신하는 앱에 자동으로 라우팅한다.

Manifest 수신자

manifest에 broadcast receiver를 선언하면 앱이 실행 중이지 않은 경우에도 시스템에서 앱을 실행한다.

API 26 이상을 타겟팅하면 manifest를 사용한 암시적 브로드캐스트의 수신자를 선언할 수 없다.
암시적 브로드캐스트: 앱을 구체적으로 타겟팅하지 않는 브로드캐스트

사용방법
  1. manifest에서 <receiver>요소를 지정
    인텐트 필터는 수신자가 구독할 브로드캐스트 작업을 지정
  2. Broadcast Receiver 서브클래스를 선언하고 onReceive()를 구현
작동 원리

앱이 설치될 때 시스템 패키지 관리자가 수신자를 등록한다
등록시점부터 앱의 새로운 진입점이 생성된다
따라서 시스템이 앱을 시작하고 브로드캐스트를 전달할 수 있다
시스템은 자기가 수신하는 브로드캐스트를 처리하기 위해 새로운 broadcast receiver 구성요소 객체를 생성한다
이 broadcast receiver 객체는 onReceive()함수 호출이 지속되는 동안 유효하다
이 메서드에서 반한되면 시스템은 더이상 active 상태가 아닌 것으로 간주한다

Context 수신자

  1. BroadcastReceiver 인스턴스 생성
  2. IntentFilter를 동적으로 생성하고 registerReceiver(br, intentFilter)를 호출하여 수신자를 등록
    • Context 수신자는 사용한 Context가 유효한 동안만 브로드캐스트를 수신
    • Activity, Application 생명주기를 따른다
  3. unregisterReceiver를 호출하여 수신 중지 가능
    • 수신자가 필요하지 않거나 컨텍스트가 유효하지 않으면 수신자 등록을 취소해야 함
    • onCreate <--> onDestroy
    • onResume <--> onPause

Process State

BroadcastReceiver의 상태는 broadcast를 사용 중인 process 상태에 영향을 끼치고 종료에도 영향을 끼친다. onRecieve함수가 작동 중인 receiver의 process는 foreground process로 간주된다. 메모리 부족이 심한 상황을 제외하고는 해당 프로세스를 유지한다.

하지만, onReceive()함수를 반환하면 더이상 broadcastRecevier는 active 상태가 아니다. Receiver의 process는 앱 내에 다른 구성요소들과 동일한 취급을 받습니다. 만약 manifest 선언 receiver만 호스트한다면, onReceive()가 반한됨에 따라, android 시스템은 그 프로세스를 낮은 순위로 고려하여 더 중요한 프로세스들을 위한 자원을 만들기 위해서 그 프로세스를 삭제할 가능성이 있다.

이러한 이유로, broadcast receiver로부터 긴 background threads 작업을 시작해서는 안된다. onReceive이후에는, process가 종료될 가능성이 있으므로 thread도 종료될 수 있다. 이런 경우를 피하기 위해, goAsync()를 호출하거나 JobScheduler를 사용하는 receiver로부터 job service를 관리한다. 그러면 시스템은 해당 process가 아직 active 상태라고 간주한다.

송신

sendOrderedBroadcast

동시에 여러 개의 브로드캐스트에 이벤트를 보내지 않고 하나에게만 보내는 함수
중요도에 따라 순차적으로 브로드캐스트를 받게 된다 (android:priority / matching intent filter)

sendBroadcast

순서 없이 모든 receiver에게 브로드캐스트를 보내는 함수
Receiver는 다른 receiver로부터 결과를 받지 못하고, 브로드캐스트로부터 받은 데이터를 전파하거나 브로드캐스트를 종료할 수 없다

LocalBraodcastManager.sendBroadcast

다른 앱에 보내지 않고 내 앱 내부에서만 broadcast 보내는 함수
보안상 이슈 걱정 없다

권한

송신

sendBroadcast의 인자로 permission string 첨부하여 함수 실행
수신하는 측에서 같은 permission을 요청하고 있어야 수신할 수 있다

수신

broadcast Receiver를 등록할 때
manifest인 경우 android:permission을 이용하여 등록
context인 경우 registerReceiver 함수 호출 시 인자로 permission string 첨부
발신 앱이 권한을 요청해야 수신자에게 전송할 수 있다

Written with StackEdit.

참고자료 1
명시적, 암시적 Intent

profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글