안드로이드 App Components - BroadCast Receiver
브로드캐스트 리시버 (BroadCast Reciever)
- 이벤트 모델로 수행되는 컴포넌트
- 인텐트 정보로 실행할 브로드캐스트 리시버가 없으면 아무 일도 발생하지 않고, 있으면 모두 실행 ( 없으면 말고, 있으면 모두 실행)
- 특정한 목적의 업무를 담당하기 위해 정의된 컴포넌트가 아님
- 한번 생성되어 실행된 브로드캐스트 리시버는 10초내에 업무처리가 종료되어야 함
- 앱 내부에서 사용하거나, 시스템에서 실행하는 인텐트에 반응하여 각종 시스템 상황을 감지하기 위해 사용
브로드캐스트 리시버 작성 방법
- BroadcastReceiver를 상속받아 작성하는 클래스
- 클래스내에 onReceive() 라는 함수를 정의해 주어야 함
- onReceive()는 브로드캐스트 리시버가 인텐트로 인해 수행될 때 자동으로 호출되는 함수
부팅완료
- 부팅 완료 시점에 시스템에서 발생시키는 브로드캐스트 인텐트에 반응할 브로드캐스트 리시버를 정의
- AndroidManifest.xml 파일에 등록하여 사용
- manifest에 선언 후 BroadcastReceiver 서브클래스를 선언, onReceive(Context, Intent) 를 구현한다.
화면 ON/OFF
- 화면이 On/Off 되는 상황에 시스템에서 브로드캐스트 인텐트를 발생, 앱에서 브로드캐스트 리시버를 이용하여 감지
- 액티비티, 서비스 등의 코드에서 동적으로 등록하여 실행
- registerReciever() 함수로 시스템에 등록
- 브로드캐스트 인텐트로 인해 실행되어야 하지만 특정 액티비티나 서비스가 구동중일때만 의미가 있는 경우 주로 이런식으로 수행됨
- BroadcastReceiver 인스턴스를 생성 후 호출을 원하는 위치에 registerReceiver(BroadcastReceiver, IntentFilter) 를 호출하여 수신자를 등록한다.
- context 에 등록된 브로드캐스트는 수신을 등록하고 취소하는게 중요한데, oncreate 에서 등록했다면 수신자가 유출되지 않도록 onDestroy 에서 수신자 등록을 해제하고, onResume 에서 등록했다면 onPause 에서 등록을 취소하여 낭비를 줄여야한다.
전화 수신/발신
- 퍼미션을 설정하면 action 문자열로 브로드캐스트 인텐트를 발생해줌
- 발신 전화번호는 인텐트 구문으로 얻을 수 있고 수신 전화번호는 Bunde 객체를 통해 얻을 수 있음
배터리
- 배터리와 관련된 브로드캐스트 인텐트의 action 문자열은 여러 가지가 있음
- onReceive() 함수에서 action 문자열을 추출하여 자신이 어떤 인텐트 정보로 인해 실행된 것인지 구분 가능
- 특정코드(액티비티, 서비스)가 실행되면서 배터리 상황을 파악해야 할때는 브로드캐스트 리시버의 객체 부분을 null로 대입, 시스템의 배터리 상태의 정보값만 받아올 수 있음
manifest 와 context 의 차이
- manifest 는 정적, context 는 동적 리시버이다
- 정적 리시버는 수신을 해제할 일이 거의 없을때, 동적 리시버는 수신의 등록, 해제가 빈번하게 일어날때 각각 유리함.
- 동적 리시버는 context 의 메서드나 변수 접근에 용이하지만 메모리 낭비를 막기위해 반드시 해제 시켜줘야 함
브로드캐스트 리시버의 백그라운드 서비스 제한
- 리시버가 백그라운드에서 암시적인 방법으로 실행되는 것을 제한
- 앱에서 암시적 방법으로 브로드캐스트 리시버를 실행하는 부분이 제한됨 (API 26 부터 적용)
- 리시버 혼자 백그라운드에서 실행되는 것이 아닌 특정 컴포넌트 작업과 관계되어 있는 경우, registerReceiver() 함수로 등록한 리시버는 암시적 인텐트로 실행 가능
알림
- Notification 객체에 각종 정보를 담고 이 객체를 NotificationManager로 시스템에 등록하는 구조
- API Level 26 부터는 채널이라는 개념이 추가되어 각 앱에 대한 알림 설정을 따로 설정해줄 수 있음
알림을 터치했을 때 사용자 이벤트를 처리하여 앱의 특정 액티비티를 실행해 주어야 하는 경우
- 시스템이 앱을 실행하도록 만들어주어야 하며, 인텐트를 사용하여야 한다.
- Pending Intent 클래스를 사용하여 처리 PendingIntent(this, requestCode, intent, flag 값(동작 구별))
- 상단바 띄우기(Heads Up) : 사용자가 중요한 작업 중일 때 Heads Up 방식으로 사용자가 이용하고 있던 화면을 유지한 상태에서 사용자의 행위를 최대한 방해하지 않을 수 있음
- 알림 중요도
