Android/Java

[Android/Java] 브로드캐스트 수신자(Broadcast Receiver)

__JeongYeon 2021. 12. 15. 15:39
반응형

[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]

 

<수신자>
 - 앱 간 또는 구성 요소 간 메시지를 주고 받을 수 있도록 한 것

 - 화면이 없는 상태에서 Intent 안에 포함된 메시지 주고받을 때 사용

 

<브로드캐스팅(Broadcasting)>

 - 메시지를 여러 객체(여러 앱 구성 요소)에 전달하는 것

 

<글로벌 이벤트(Global Event)>

 - 단말 전체에 메시지가 전달되는 것

 

<브로드캐스트 수신자(Broadcast Receiver)>

 - 브로드캐스딩 메시지 받고 싶은 경우 사용((ex)앱 A에서 앱 B로 메시지 전달)

 - 서비스와 마찬가지로 앱의 구성 요소이므로 Manifest 파일에 등록해야 시스템이 알 수 있고 화면도 없게 됨

 - Manifest가 아닌 소스 코드에서 registerReceiver() 메서드 사용해 시스템에 등록할 수 있는데, 이 경우 액티비티 안에서 브로드캐스트 메시지 전달받아 바로 다른 작업 수행하도록 할 수 있는 장점이 있음

 - 얻을 수 있는 이벤트

  - 배터리 부족, 네트워크 연결/끊김, SD카드 삽입/제거, SMS 수신, 카메라 버튼 눌림, 휴대폰의 날짜*시간 변동, 비행기모드 전환, 어플 설치/제거, 재부팅/종료 등등..

 

*참고*

 - 오레오 이전 버전은 앱이 꺼져도 정상적으로 브로드캐스트 수행

 - 오래오 이상의 버전은 앱이 꺼지면 리소스 소모 등의 이유로 기능이 제한됨

 

<브로드캐스트 등록 및 사용(예제는 SMS 메시지 수신)>

[app -> New -> Other -> Broadcast Recevier]

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        throw new UnsupportedOperationException("Not yet implemented");
    }
}

 - onReceive() 메서드는 원하는 브로드캐스트 메시지가 도착하면 자동으로 호출됨(예제에서는 SMS 메시지가 들어간 Intent 수신한 경우 onReceive() 메서드가 호출됨)

 - 원하는 메시지만 받으려면 Intent-filter 사용해 시스템에 등록하면 됨

  - Manifest에 등록된 receiver에 intent-filter 추가

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

  - android.provider.Telephony.SMS_RECEIVED는 SMS 메시지가 들어간 Intent 구분하기 위한 액션 정보

 

...계속 추가 예정

반응형