반응형
Greensky0026
삽질러의 대환장 공사판
Greensky0026
전체 방문자
오늘
어제
  • 분류 전체보기 (241)
    • Language (56)
      • JAVA (13)
      • Swift (38)
      • Kotlin (4)
      • Dart (0)
      • PHP (0)
      • JavaScript (1)
    • IDE & Framework (92)
      • Spring (10)
      • Android (48)
      • iOS (8)
      • NodeJS (1)
      • CodeIgniter (3)
      • Flutter (1)
      • 분류중 (18)
    • Infra (8)
    • Database (12)
    • VCS (4)
    • Debug Log (34)
      • java (7)
      • swift (3)
      • Android (9)
      • Web (7)
      • 삽질기 (7)
    • Others (19)
      • 코딩테스트 풀이 (0)
      • IT 이야기 (18)
    • 쉼터 (2)
    • 개발공부 (14)
      • Network (1)
      • 자료구조와 알고리즘 (2)
      • Code design (8)
      • ETC (1)
      • 아카이브 (1)

블로그 메뉴

    공지사항

    • 프로그래머스 코딩 테스트 관련글 비공개 처리

    인기 글

    태그

    • xcode
    • JSP
    • 예제
    • ios
    • 공부
    • reduce
    • Java
    • 프로그래머스
    • 개발
    • kotlin
    • Android
    • level1
    • swift
    • IT
    • swfit
    • 구축
    • 타입
    • 프로그래밍
    • map
    • 코딩테스트

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

    [Kotlin] Broadcast recevier란? 사용법과 예제
    IDE & Framework/Android

    [Kotlin] Broadcast recevier란? 사용법과 예제

    2022. 1. 15. 20:44
    반응형

    Broadcast recevier란?

     말그대로 Broadcast를 받는 수신기라고 생각하시면 됩니다.

    Manifest에 수신기를 선언하거나, Context에 수신기를 구현하는 두가지 방법이 존재합니다.

    안드로이드 백그라운드 정책 강화로 API 26부터 기존에 비해 수신기 구현이 어려워졌습니다.

    수신대상의 패키지, 클래스명을 입력하는 명시적 브로드캐스트나, 몇가지의 암시적 브로드캐스트 예외(링크)를 제외하고는 모두 Context에 직접 수신기를 구현해야 합니다.

     

    - Manifest / Context 수신기 등록 차이

        Manifest에 등록시

            - 앱이 실행중이 아니여도 이벤트를 수신하고 작업을 처리할 수 있습니다.

        Context에 등록시

            - 앱이 실행중이여야 이벤트를 수신하고 작업을 처리할 수 있습니다.

     

     

    수신기 등록하기

    1. Manifest에 등록

    <application>
    //...
    
        <receiver android:name="com.example.broadcastlibtestb.MyBroadcastReceiver"  android:exported="true">
            <intent-filter>
                <action android:name="com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB"/> //1
                <action android:name="android.intent.action.PACKAGE_FULLY_REMOVED" /> //2
                <action android:name="android.intent.action.PACKAGE_DATA_CLEARED" /> //3
                <data android:scheme="package" /> //4
            </intent-filter>
        </receiver>
    
    //...
    </application>

    Manifest의 application 태그 안에 recevier 태그를 입력해서 수신기를 등록합니다.

    android:name에는 broadcast recevier를 구현한 클래스명을 입력하고,

    android:exported="true"로 입력함으로써 외부에서의 호출을 허용합니다.

     

    recevier 태크 안에 intent-filer로 구독할 Action명을 입력하면 해당 이벤트를 수신할수 있습니다.

    1번은 직접 만든 이벤트이고, 2,3번은 Android System에서 발송하는 브로드캐스트 action입니다.

    참고로, Android System broadcast를 받으려면 4번을 입력해둬야 합니다.

     

    2.Context에 등록

    val reciver = MyBroadcstReceiver
    intentFilter = IntentFilter()
    intentFilter.addAction("com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB")
    intentFilter.addAction("android.intent.action.PACKAGE_FULLY_REMOVED")
    intentFilter.addAction("android.intent.action.PACKAGE_DATA_CLEARED")
    registerRecevier(receiver, intentFilter) //등록
    //unregisterReveiver(receiver) //해제

     Context에서 제공하는 registerRecevier()를 사용해서 등록하는 방법입니다.

     

    Broadcast receiver 구현

     구현은 어렵지 않습니다. BroadcastReceiver()를 상속받는 클래스를 생성하면 됩니다.

     

    MyBroadcastReceiver.kt

    class MyBroadcastReceiver : BroadcastReceiver(){
        override fun onReceive(context: Context?, intent: Intent?) {
          StringBuilder().apply {
              if (intent == null) {
                  return
              }
    
              append("Action: ${intent.action}\n")
              append("URI: ${intent.toUri(Intent.URI_INTENT_SCHEME)}\n")
              toString().also { log ->
                  Log.d(TAG, "$log intent:$intent")
              }
          }
        }
    }

    메세지 받은 결과

    2022-01-12 15:05:45.155 23603-23603/com.example.broadcasttesta D/MyBroadcastReceiver: Action: android.intent.action.PACKAGE_FULLY_REMOVED
    URI: intent:com.example.broadcasttestc#Intent;scheme=package;action=android.intent.action.PACKAGE_FULLY_REMOVED;launchFlags=0x5000010;component=com.example.broadcasttesta/.MyBroadcastReceiver;B.android.intent.extra.REMOVED_FOR_ALL_USERS=true;B.android.intent.extra.DONT_KILL_APP=false;i.android.intent.extra.UID=10316;B.android.intent.extra.DATA_REMOVED=true;i.android.intent.extra.user_handle=0;end
    intent:Intent { act=android.intent.action.PACKAGE_FULLY_REMOVED dat=package:com.example.broadcasttestc flg=0x5000010 cmp=com.example.broadcasttesta/.MyBroadcastReceiver (has extras) }

     

     

    후기

     확실히 공부만 하는것과 써보는것이 이해의 차이가 아주 큰 것 같습니다.

    클린코드에서 학습단위를 작은것부터 반복적으로 하면 아주 효과적이라고 했듯이 말이죠.

    모두들 즐거운 코딩 되시길!

     

     


    참고 사이트

    https://developer.android.com/guide/components/broadcasts?hl=ko 

    https://developer.android.com/guide/components/broadcast-exceptions?hl=ko 

    https://developer.android.com/about/versions/oreo/background?hl=ko 

     

    반응형
    저작자표시 비영리 (새창열림)

    'IDE & Framework > Android' 카테고리의 다른 글

    Android Background Service 작업 제한  (1) 2022.01.22
    [Kotlin]local properties에 변수 저장하기  (3) 2022.01.22
    [Kotlin] Broadcast 란? 사용법과 예제  (0) 2022.01.15
    [Kotlin] RemoteConfig 적용하기 [간단]  (0) 2022.01.09
    [Kotlin] Firebase Crashlytics 적용시키기 (간단!)  (0) 2022.01.09
      'IDE & Framework/Android' 카테고리의 다른 글
      • Android Background Service 작업 제한
      • [Kotlin]local properties에 변수 저장하기
      • [Kotlin] Broadcast 란? 사용법과 예제
      • [Kotlin] RemoteConfig 적용하기 [간단]
      Greensky0026
      Greensky0026
      점이 모여 선이 된다. 내 삽질도 언젠간 거대한 지하 도시가 되겠지!

      티스토리툴바