[안드로이드스튜디오_문화][BroadCastReceiver]

기말 지하기포·2023년 11월 29일
0

#BroadCast Android Developer 문서 링크
=>https://developer.android.com/guide/components/broadcasts?hl=ko

BroadCastReceiver

정의

-안드로이드 앱이 안드로이드 시스템 또는 다른 앱에서 발생하는 다양한 이벤트 또는 정보를 받을 수 있게 도와준다.

-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")
        }
    }
}
  • Settings.Global.getInt()는 안드로이드 시스템 설정의 활성화 / 비활성화 하나의 값을 0 또는 1로 반환한다.
  • 위 코드에서는 비행기 모드가 켜져 있으면 1 , 꺼져 있으면 0으로 반환된다.

-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번을 활용해서 전체코드를 실행하면 아래와 같은 사진이 나온다.

  • 이처럼 pause와 resume이 반복되면 브로드캐스트리시버가 등록되었다가 해제되었다가를 반복한다.


명시적 브로드캐스트리시버 + 생명주기

class TestReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if(intent?.action == "TEST_ACTION") {
            println("내가 만든 쿠키~ 너가 만든 리시버~")
        }
    }
}
  • 우선 암시적이랑 똑같이 브로드캐스트 리시버를 상속받아서 브로드캐스트리시버를 만들어준다. "TEST_ACTION"을 받으면 {}블락의 내부에 있는 코드들이 실행 될 것이다.


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가 방송을 수신해서 코드상에 작성된 구현을 실행하는 것이다.

  • 실행 결과는 아래와 같습니다.

profile
포기하지 말기

0개의 댓글