BroadcastReceiver

지프치프·2022년 1월 27일
0

Android

목록 보기
40/85
post-thumbnail

“Android 로봇은 Google에서 제작하여 공유한 저작물을 복제하거나 수정한 것으로 Creative Commons 3.0 저작자 표시 라이선스의 약관에 따라 사용되었습니다.”


BroadcastReceiver란?

BroadcastReciver
시스템 이벤트가 발생 할 때마다 앱에 알려주는 리시버이다.
반대로 앱에서 특정 이벤트를 다른 앱으로 알려주는 것도 가능하다.
오늘은 Receiver를 통해 Broadcast를 수신하는 방법을 써보려고 한다.

Receiver 만들기

Receiver는 BroadcastReceiver를 상속받아서 만들 수 있다.
상속 받은 뒤 onReceive()메소드를 재정의해서
이벤트에 대한 처리를 작성하면 된다.
코드는 아래와 같다.

class MyReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        intent?.let {
            when(it.action) {
                Intent.ACTION_SHUTDOWN -> { Log.e("TEST", "Shut down") }
                Intent.ACTION_AIRPLANE_MODE_CHANGED -> {
                    Toast.makeText(context, "AIRPLANE MODE", Toast.LENGTH_SHORT).show()
                }
                else -> {}
            }
        }
    }
}

Intent.ACTION_SHUTDOWN 기기의 전원이 꺼질 때 발생한다.
Intent.ACTION_AIRPLANE_MODE_CHANGED 비행기 모드로 전환될 때 발생한다.

Receiver 선언

Receiver를 선언하는 방법은 2가지가 있는데
암시적 선언하는 방법과 명시적 선언하는 방법이 있다

암시적 선언

암시적 선언은 AndroidManifest에 intent를 등록하는 방식이다.
AndroidManifestapplication 하위에 선언해주면 된다.

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        ... 이하 생략... >
        <receiver android:name="MyReceiver">
            <intent-filter>
                <action android:name="android.intent.action.ACTION_SHUTDOWN" />
                <action android:name="android.intent.action.AIRPLANE_MODE" />
            </intent-filter>
        </receiver>

명시적 선언

명시적 선언은
IntentFilteraddAction()메소드를 통해 선언해주는 방법이다.
코드는 아래와 같다.

        IntentFilter().apply {
            addAction("android.intent.action.ACTION_SHUTDOWN")
            addAction("android.intent.action.AIRPLANE_MODE")
        }

registerReceiver

이제 만들어준 Receiver를 앱에 등록해주는 일만 남았다.
등록은 Context의 registerReceiver() 메소드를 통해 가능하다.
즉 Context를 상속받는 Activity나 Service 어디든 등록이 가능하다.
반대로 앱이 종료되기 전에 해지도 해주어야한다.
해지는 unregisterReceiver()메소드를 통해 가능하다.

private val receiver = MyReceiver()
override fun onCreate() {
	super.onCreate()
	registerReceiver(receiver, IntentFilter().apply() {
    		addAction("android.intent.action.ACTION_SHUTDOWN")
        	addAction("android.intent.action.AIRPLANE_MODE")
    	})
}
override fun onDestroy() {
	super.onDestroy()
	unregisterReceiver(receiver)
}

참고로 Receiver는 메인 스레드에서만 동작한다.
이제 실행을 해보면 결과는 아래와 같다.


종료 되었을때
FirebaseSample 프로젝트에서 만들었지만 Firebase와는 아무 연관이 없다

비행기모드 전환되었을때

암시적 브로드캐스팅 제한

암시적 브로드캐스팅, 위에서 설명한 암시적 선언은 API Level 26부터 제한되었다.
그래서 Target Level이 26이상이라면 암시적 선언이 작동하지 않는다.
단, Google에서는 제한이 면제되는 몇가지 예외사항들을 명시해놓았다.
해당 사항들은 공식 문서에서 확인해보자

하지만 암시적 선언을 꼭 사용하고 싶다면
build.gradle에서 targetSdkVersion을 26 미만으로 맞추면 사용할 수는 있다.

개인적으로 공부했던 것을 바탕으로 작성하다보니
잘못된 정보가 있을수도 있습니다.
인지하게 되면 추후 수정하겠습니다.
피드백은 언제나 환영합니다.
읽어주셔서 감사합니다.

profile
지프처럼 거침없는 개발을 하고싶은 개발자

0개의 댓글