#BroadCast Android Developer 문서 링크
=>https://developer.android.com/guide/components/broadcasts?hl=ko
-안드로이드 앱이 안드로이드 시스템 또는 다른 앱에서 발생하는 다양한 이벤트 또는 정보를 받을 수 있게 도와준다.
-BroadCastReceiver를 사용하면 앱이 백그라운드에서 실행되고 있을 때도 , 다양한 안드로이드 시스템 이벤트(ex : 배터리 없음 , 와이파이 변경) 또는 앱 간의 정보(ex : 다른 앱에서 보내는 데이터를 받음)를 수신 할 수 있다.
-BroadCastReceiver를 사용하는 방법에는 두가지 방법이 있다. 하나는 AndroidManifest.xml에 리시버를 선언하는 정적 등록방법과 , 코드상에서 리시버를 동적으로 등록해서 사용하는 방법이 있다.
-Android API26 이상에서는 백그라운드 실행 제한으로 인해서, 많은 암시적 브로드캐스트리시버를 AndroidManifest.xml에 등록할 수 없게 되었다.대신에 필요할 때마다 코드상에서 동적으로 브로드캐스트 리시버를 등록하는 방식을 사용하면 된다.
-명시적 브로드캐스트리시버는 특정 앱 또는 컴포넌트가 인텐트를 명시적으로 지정할 때 사용됩니다. 안드로이드 시스템이나 다른 앱으로부터 방송을 수신 받는 것이 아니라, 앱 자체에서 특정 목적을 위해 생성한 브로드캐스트에 반응하도록 하고 싶을 때 사용한다. 이또한 동적으로 등록하는것을 권장한다.
-암시적 브로드캐스트리시버는 특정 액션에 반응하여 여러 앱에서 사용할 수 있도록 설정하고, 특정 앱에 한정되지 않는다. 예를들면, 비행기 모드 또는 배터리 부족 같은 시스템 이벤트에 반응하기 위해 사용된다. 하지만 위에서 말했던 것처럼 API26 부터는 백그라운드에서 실행이 안 되니까 동적으로 암시적 브로드 캐스트를 동록해서 사용해야 한다.
-1. BroadcastReceiver를 상속받는 클래스 만들기.
class AirPlaneModeReceiver : BroadcastReceiver(){
override fun onReceive(context : Context?, intent : Intent?) {
if(intent?.action == Intent.ACTION_AIRPLANE_MODE_CHANGED) {
val isTurnedOn = Settings.Global.getInt(
context?.contentResolver,
Settings.Global.AIRPLANE_MODE_ON
) != 0
Log.d("haha", "비행기모드가 $isTurnedOn")
}
}
}
-2. registerReceiver(브로드캐스트 리시버 객체 , IntentFilter()) 메서드를 사용해서 BroadcastReceiver를 등록한다.
override fun onResume() {
super.onResume()
registerReceiver(
airPlaneModeReceiver,
IntentFilter(Intent.ACTION_AIRPLANE_MODE_CHANGED)
)
}
브로드캐스트를 동록할 때는 onResume() 부분에서 등록하는 것이 좋다. 왜냐면 만약 onCreate()에서 등록한다면 생명주기에서 단 한번만 호출되기 때문에 다른 데 갔다가 오면 재등록되지 않는다. 따라서 보통 onResume()에서 등록하고 해제할 때에는 onPause()에서 해제하면 리소스를 효율적으로 관리 할 수 있게 해준다.
위에서 registerReceiver()를 활용해서 브로드캐스트리시버를 등록하는 것이 바로 동적으로 브로드 캐스트 리시버를 등록하는 것이다.
-3. 1번 2번을 활용해서 전체코드를 실행하면 아래와 같은 사진이 나온다.
class TestReceiver : BroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
if(intent?.action == "TEST_ACTION") {
println("내가 만든 쿠키~ 너가 만든 리시버~")
}
}
}
override fun onResume() {
val testIntentFilter = IntentFilter("TEST_ACTION")
registerReceiver(testReceiver, testIntentFilter)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
VelogBroadCastReceiverTheme {
Button(onClick = { sendTestBroadcast() }) {
Text(text = "너가 만든 쿠키~")
}
}
}
}
private fun sendTestBroadcast() {
val intent = Intent("TEST_ACTION")
sendBroadcast(intent)
}
sendBroadcast()를 통해서 해당 인텐트를 전송하면 해당 인텐트에 알맞는 인텐트 필터를 가진 모든 브로드캐스트리시버를 상속받은 클래스가 수신 받을 수 있다.
따라서 TestReceiver가 방송을 수신해서 코드상에 작성된 구현을 실행하는 것이다.
실행 결과는 아래와 같습니다.