Android 시스템 및 기타 Android 앱에서 브로드캐스트 메시지를 보내거나 받을 수 있다. 이러한 브로드캐스트는 관심 이벤트가 발생할 때 전송된다. 시스템에서 보내는 브로드캐스트와 앱에서 보내는 커스텀 브로드캐스트가 있다.
ex) 시스템 : 부팅, 디바이스 충전 시작 등 / 커스텀 : 데이터 다운로드 완료 등
Android 플랫폼별 변경점
- Android 10(Q, API 29)
- Android 9 (Pie, API 28)
- NETWORK_STATE_CHANGED_ACTION 브로드캐스트에서 사용자 위치나 개인 정보 데이터를 받을 수 없다.
- 앱이 Android 9 이상을 실행하는 기기에 설치된 경우 Wi-Fi 브로드캐스트에 SSIDs, BSSIDs, 접속 정보, 스캔 결과가 포함되지 않는다. 해당 정보를 얻으려면 getConnectionInfo() 를 사용해야 한다.
- Android 8.0 (Oreo, API 26)
- Manifest에 선언된 리시버에 추가적인 접근제어가 강제된다.
- 앱이 Android 8.0 (API 26) 이상을 타겟팅할 경우 암시적 브로드캐스트(앱을 특정하여 대상으로 지정하지 않는 브로트캐스트)를 사용할 수 없다.
- 명시적 브로드캐스트 리시버 등록하는 방법은 동일하게 사용할 수 있다.
- Android 7.0 (Nougat, API 24)
- ACTION_NEW_PICTURE, ACTION_NEW_VIDEO 브로드캐스트는 사용할 수 없다.
- 앱이 Android 7.0 (API 24) 이상을 타겟팅할 경우 CONNECTIVITY_ACTION 브로드캐스트를 사용할 경우엔 반드시 registerReceiver(BroadcastReceiver, IntentFilter)를 사용해서 등록해야 한다.
Context
- Context의 정의
- Application 환경에 대한 전역 정보를 접근하기 위한 인터페이스
- 추상 클래스이며 실제 구현은 Android 시스템에 의해 제공
- Context를 통해 Application 에 특화된 리소스나 클래스에 접근 가능
- Activity 실행, 브로드캐스팅, Intent 수신 등과 같은 Application 레벨의 작업을 수행하기 위한 API 호출 가능
- Context의 역할
- Application과 관련된 정보에 접근하거나 Application과 연관된 시스템 레벨의 함수를 호출할 때 사용한다.
- 안드로이드 시스템에서 Application 정보를 관리하고 있는 것은 시스템이 아닌 ActivityManagerService라는 일종의 또 다른 Application이다.
- 안드로이드에서는 Application과 관련된 정보에 접근할 때는 ActivityManagerService를 통해야 한다.
- 자신이 어떤 Application을 나타내고 있는지 알려주는 ID 역할
- ActivityManagerService에 접근할 수 있도록 하는 통로 역할
- Context의 종류
- Application Context : Application의 lifecycle의 영향을 받아 항상 함께 한다.
- Activity Context : Activity의 lifecycle의 영향을 받아 onDestroy()와 함께 사라진다.
브로드캐스트 수신
- Manifest-declared receiver (암시적 브로드캐스트 리시버) : 앱 Manifest에 리시버를 선언하여 브로드캐스트가 전송되면 앱을 시스템에서 실행한다( 앱이 실행 중이지 않을 경우).
- Manifest에 리시버 등록방법
- Manifest에 <receiver> 요소를 등록하고 수신할 브로드캐스트를 <intent-filter>에 지정한다.
- registerReceiver() 혹은 <receiver>를 사용해 브로드캐스트 리시버를 등록할 때 권한 매개 변수를 지정하면 Manifest의 <uses-permission> 태그에 해당 권한이 등록된 브로드캐스트만 수신할 수 있다.
- BroadcastReceiver 클래스를 상속받아 onReceive(Context, Intent)를 구현한다.
- Manifest에 <receiver> 요소를 등록하고 수신할 브로드캐스트를 <intent-filter>에 지정한다.
- 시스템 패키지 매니저는 앱이 설치될 때 리시버를 등록하여 앱이 실행하고 있지 않으면 시스템이 앱을 실행하여 브로드캐스트를 전달할 수 있다.
- 시스템은 새로운 BroadcastReceiver 컴포넌트 오브젝트를 생성하여 수신하는 각각의 브로드캐스트를 처리한다. 이 오브젝트는 onReceive(Context, Intent)을 호출하는 동안만 유효하다. onReceive() 메서드에서 리턴되면 시스템은 해당 컴포넌트를 더 이상 활성화되지 않게 변경한다.
- Manifest에 리시버 등록방법
- Context-registered receiver (명시적 브로드캐스트 리시버)
- 명시적 브로드캐스트 리시버는 등록된 context가 유효할 경우에만 브로드캐스트를 수신한다.
- ex) Activity context에 등록하면 해당 Activity가 소멸되지 않은 경우(destroyed)에만 수신한다. Application context에 등록하면 해당 앱이 실행중인 경우에만 수신한다.
- BroadcastReceiver 객체 생성
- IntentFilter를 생성하고 registerReceiver(BroadcastReceiver, IntentFilter)를 호출하여 리시버를 등록한다.
- 내부적으로만 사용할 경우엔 LocalBroadcastManager.registerReceiver(BroadcastReceiver, IntentFilter)를 호출하여 등록한다.
- 브로드캐스트 수신을 멈출 경우엔 unregisterReceiver(android.content.BroadcastReceiver)를 호출한다. 리시버 등록해제는 해당 리시버가 더 이상 필요하지 않거나 context가 더 이상 유효하지 않은 경우에만 한다.
- Activity context 사용시, onCreate()에 리시버를 등록하면 onDestroy()에 리시버 등록 해제를 하여 Activity context 밖으로 리시버 유출을 방지해야 한다. onResume()에 등록할 경우 onPause()에 등록 해제하여 중복 등록을 방지해야 한다. 사용자가 되돌아올 경우 리시버를 호출할 수 없기 때문에 onSavedInstanceState()에는 등록해제를 해선 안된다.
브로드캐스트 송신
- sendOrderBroadcast(Intent, String)
- 한번에 하나의 리시버에 브로드캐스트를 보낸다. 수신한 리시버의 onReceive()가 리턴되어야 다음 리시버에게 브로드캐스트에 보낸다. 수신자가 리턴한 결과를 다음 수신자에게 결과를 전달하거나 브로드캐스트를 중단하여 다음 수신자에게 전달하지 않도록 제어할 수 있다. <intent-filter>의 android:priority 속성으로 우선순위 제어가 가능하다. 우선순위가 동일할 경우 임의로 순위가 정해진다.
- sendBroadcast(Intent)
- 모든 리시버에 순서없이 브로드캐스트를 보낸다. 가장 효율적이지만 수신한 데이터를 전파하거나 브로드캐스트를 중단할 순 없다.
- LocalBroadcastManager.sendBroadcast(Intent)
- 자신의 앱에만 브로드캐스트를 보낸다. 내부적으로 송신할 경우에 사용한다.
- 위 세가지 메서드를 사용할 때 String값에 권한 매개변수를 작성하여 브로드캐스트를 보내는 경우 해당 권한을 갖고 있어야 수신이 가능하게 제어가 가능하다.
- 브로드 캐스트 리시버를 등록 할 때 권한 매개 변수를 지정하면 매니페스트에서 <uses-permission> 태그로 권한을 요청한 브로드 캐스터 (그리고 권한이 있는 사용자 인 경우 권한이 부여 된 브로드 캐스터) 만 리시버에게 인텐트를 보낼 수 있다
'안드로이드 > Guide' 카테고리의 다른 글
안드로이드 개발 - (7) View, ViewGroup, Inflation의 개념 (0) | 2020.04.09 |
---|---|
안드로이드 개발 - (6) Android Component: Content Providers (0) | 2020.03.06 |
안드로이드 개발 - (4) Android Component: Service (0) | 2020.03.04 |
안드로이드 개발 - (3) Android Component: Activity (0) | 2020.03.03 |
안드로이드 개발 - (2) Android Studio 프로젝트 생성 (0) | 2020.03.02 |