안드로이드 15) BroadcastReceiver

밍나·2022년 1월 23일
0

Android

목록 보기
15/36

Concepts of BroadcastReceiver

1. BroadcastReceiver

  • 이벤트(유저 이벤트가 아닌 시스템의 특정 상황) 모델로 실행되는 컴포넌트
    • BroadcastReceiver를 만들고 안드로이드 시스템이 특정 상황이 됐을 때 시스템에 의해 BroadcastReceiver가 실행
    • 코드에서 어떤 특정 상황이 됐을 때(유저 이벤트X) 시스템에 알려줘서 시스템에 의해 실행

2. BroadcastReceiver 사용 방법
1) BroadcastReceiver를 상속받은 클래스 작성

class MyReceiver: BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
    
    }
}

2-1) AndroidManifest.xml 파일에 등록

<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true"></receiver>
  • name 속성은 생략 불가, 클래스명 정보를 주는 것

2-2) AndroidManifest.xml에 등록시키지 않고 코드에서 필요한 순간 동적 등록이 가능

val receiver = object: BroadcastReceiver(){
    override fun onReceive(context: Context?, intent: Intent?) {
    
    }
}
val filter = IntentFilter("ACTION_RECEIVER")
registerReceiver(receiver, filter)
  • Manifest에 등록되면 항상 실행되고 보통 특정 상황에서만 실행하기를 원하기 때문에 이 방법을 더 많이 사용
  • IntentFilter에 Receiver가 언제 실행이 되어야 하는지에 대한 정보를 담아줌
  • 필요한 순간 registerReceiver() 함수를 통해 등록하면 시스템에 등록 됨
  • 2-1)에서 receiver 태그 안에 intent-filter 태그와 action 태그를 담아주는 것과 동일
unregisterReceiver(receiver)
  • 필요한 순간 사용하고 다 사용을 했을 때는 unregisterReceiver() 함수로 해제

3) BroadcastReceiver 실행

val intent = Intent(this, MyReceiver::class.java)
sendBroadcast(intent)
  • BroadcastReceiver가 component이기 때문에 intent 필요, intent filter가 존재하면 암시적 인텐트 존재하지 않으면 명시적 인텐트 준비
  • sendBroadcast() 함수로 리시버 실행

3. Intent 동작 원리
1) Activity Intent 동작 원리

  • Activity Intent가 발생했을 때
    • intent filter에 의해 조건에 맞는 것이 없다면 intent를 발생시킨쪽 코드에서 에러
    • 조건에 맞는 것이 1개면 실행
    • 조건에 맞는 것이 여러 개면 유저 선택성으로 하나만 실행(앱에서 인터넷 실행할 때 삼성 인터넷, chrome 등 선택하는 것)

2) BroadcastReceiver Intent 동작 원리

  • BroadcastReceiver Intent가 발생했을 때
    • intent filter에 의해 조건에 맞는 것이 없어도 에러 발생하지 않음
    • 조건에 맞는 것이 1개면 실행
    • 조건에 맞는 것이 여러 개면 모두 실행

시스템 이벤트 활용

  • BroadcastReceiver가 시스템의 특정 상황에서 실행되는 경우

1. 부팅 완료

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<receiver
    android:name=".MyReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter>
    	<action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>
  • 부팅 완료 시점에 특정 업무를 진행
  • BroadcastReceiver를 만들고 AndroidManifest.xml 파일에서 시스템에 띄우는 인텐트 정보로 intent-filter를 구성해 등록

2. 스크린 온/오프

val filter = IntentFilter(Intent.ACTION_SCREEN_ON).apply{
    addAction(Intent.ACTION_SCREEN_OFF)
}
registerReceiver(receiver, filter)
  • 스크린이 on/off 되는 순간 BroadcastReceiver를 실행
  • 코드에서 registerReceiver() 함수를 이용해 동적 등록해야만 실행, Manifest로 등록하는 정적 등록으로는 receiver가 실행이 되지 않음

3. 배터리 상태

  • 배터리와 관련된 액션 문자열, 배터리가 특정 상태가 되었을 때 시스템에서 인텐트 발생
    • android.intent.acion.BATTERY_LOW : 배터리가 낮은 상태로 변경되는 순간
    • android.intent.acion.BATTERY_OKAY : 배터리가 정상 상태로 변경되는 순간
    • android.intent.acion.BATTERY_CHANGED : 충전 상태가 변경되는 순간
    • android.intent.acion.ACTION_POWER_CONNECTED : 전원이 공급되기 시작한 순간
    • android.intent.acion.ACTION_POWER_DISCONNECTED : 전원 공급을 끊은 순간
profile
🤗🤗🤗

0개의 댓글