외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 25(브로드캐스트 리시버 이해하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 25(브로드캐스트 리시버 이해하기)

Nova_ 2023. 2. 14. 12:56

- 브로드캐스트 리시버

브로드캐스트 리시버는 흔히 이벤트 모델로 실행되는 컴포넌트라고 정의합니다. 시스템에 어떤 이벤트가 발생하면 브로드캐스트 리시버를 실행해 앱이 해당상황에 맞게 동작할 수 있습니다.

 

- 브로드캐스트 만들기

브로드캐스트 리시버는 BroadcastReciever를 상속받는 클래스를 선언해야합니다. 또한 브로드캐스트 리시버의 생명주기는 onRecevie() 하나뿐입니다. 따라서 이 함수를 override 해줍니다.

class MyReceiver : BroadcastReceiver(){
	override fun onRecevie(context: Context, intent: Intet){
    }
}

특히 onRecevie는 10초이내에 완료할 것을 권장함으로 오래걸리는 작업을 담기에는 부적절합니다. 브로드캐스트 리시버도 컴포넌트이므로 등록해줘야합니다. 등록하는 방법은 두가지가 있습니다.

 

- 브로드캐스트 등록하기

<매니페스트파일에 등록하기>

브로드캐스트 리시버도 컴포넌트이므로 매니페스트 파일에 등록합니다. 브로드캐스트 리시버를 등록하는 태그는 <receiver>이며 필수속성은 name입니다. 명시적 인텐트로 실행하려면 클래스명만 등록하고, 암시적 인텐트로 실행하려면 <intent-filter>를 선언해줍니다.

<recevier
    android:name=".MyRecevier"
    android:enable="true"
    android:exported="ture"></receiver>

<동적으로 코드에 등록하기>

특정한 상황에서 브로드캐스트 리시버를 항상 실행해야한다면 매니페스트 파일에 등록해서 사용하면되지만 특정한 액티비티나 서비스가 동작할때만 브로드캐스트 리시버를 실행해야한다면 컴포넌트가 실행될때 동적으로 등록하는 방법을 사용합니다. 동적 등록 방법은 아래와 같습니다.

val filter = IntetnFilter("ACTION_RECEVIER")
registerReceiver(receiver, fileter)

위 코드로 등록하면 시스템이 리시버의 존재를 인지합니다. 등록한 리시버는 필요없으면 해제해줘야합니다. 이때는 아래 코드로 등록해제합니다.

unregisterReceiver(receiver)

 

- 브로드캐스트 리시버 실행하기

브로드캐스트 리시버를 만들고 등록해줬다면 실행해야합니다. 브로드캐스트 리시버를 실행하겠다고 시스템에게 알릴려면 인텐트가 필요합니다. 매니페스트 파일에 리시버의 클래스명만 등록했으면 명시적 인텐트로 실행하지만 <intet-filter>태그를 선언했다면 암시적 인테트로는 실행할 수 없습니다. 물로 코드에서 등록한 암시적 인테트는 잘 실행됩니다. 인텐트를 만들고 sendBroadcast()함수로 시스템에게 알립니다.

val intetn - Intet(this, MyReceiver::class.java)
sendBroadcast(intent)

 

- 브로드캐스트 리시버와 액티비티 인텐트 차이

액티비티 인텐트는 실행대상 액티비티가 없으면 오류가 발생하고 여러개라면 사용자 선택으로 1개가 실행되지만 브로드캐스트 리시버 인텐트는 실행대상이 없다면 오류가 발생하지않고 여러개라면 모두 실행되는 차이가 있습니다.

Comments