반응형
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)

블로그 메뉴

    공지사항

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

    인기 글

    태그

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

    최근 댓글

    최근 글

    티스토리

    hELLO · Designed By 정상우.
    Greensky0026

    삽질러의 대환장 공사판

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

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

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

    Broadcast란?

     Android Application이나 Android System에서 Publish-subscribe pattern처럼 이벤트를 송/수신 하는 컴포넌트입니다.

    이벤트는 intent객체에 담겨서 발송되게 됩니다.

    Broadcast의 intent 뜯어보기

     이벤트는 intent에 문자열로 담겨서 전송되며, 구조는 아래와 같습니다.

    //android.intent.action.PACKAGE_FULLY_REMOVED이벤트 broadcast의 intent
    Intent { 
        act=android.intent.action.PACKAGE_FULLY_REMOVED 
        dat=package:com.example.broadcasttestc 
        flg=0x5000010
        cmp=com.example.broadcasttesta/.MyBroadcastReceiver (has extras) 
    }

    그리고 이는 아래처럼 호출하여 문자열로 획득할 수 있습니다.

    intent.action
    intent.data
    intent.flags
    intent.component

    action은 브로드캐스트의 이벤트 이름으로써, 수신기가 action을 intent-filter에 입력하여 수신할 수 있습니다.

    data는 uri type으로 파싱된 문자열입니다. 보통 Android System Broadcast들은 data에 발송지가 적혀 있습니다.

    여기에 더불어서 intet에 직접 putExtra()를 사용해 본인이 추가로 데이터를 더 싣을 수 있고, flag를 추가할수도 있습니다.

     

    Braodcast 발송하기

     Android System broadcast는 직접 발송할 수 없습니다.

    그리고 직접 발송하는 broadcast는 명시적 브로드캐스트와 암시적브로드캐스트 두 종류로 나눌 수 있습니다.

    참고로, 목적지의 패키지/클래스명을 component 속성에 담아 발송하면 명시적 인텐트,

    목적지 없이 보내는 것을 암시적 인텐트라 합니다. 이 둘의 차이는 아래에서 설명드리겠습니다.

     

    보내는 방법

     보통은 모든 수신자에게 한번에 보내는 sendBroadcast()를 많이 사용하는데,

    한 수신자에게만 전달하는 sendOrderBroadcast(),

    앱 내부에만 발송하는 LocalBroadcastManager.sendBroadcast()도 있습니다.

     

    명시적 브로드캐스트 발송

    Intent().also { intent ->
        intent.action = "com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB"
        intent.component = ComponentName("com.example.broadcasttestb", "com.example.broadcasttestb.MyBroadcastReceiver")
        intent.putExtra("onNewTokenMillis", System.currentTimeMillis().toString())
        intent.data = (Uri.parse("package:${this.packageName}"))
        intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        sendBroadcast(intent)
    }

    com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB 이라는 이벤트를

    com.example.broadcasttestb 패키지의 com.example.broadcasttestb.MyBroadcastReceiver 클래스로

    "package:${this.packageName}"을 intent.data에 담고,

    "onNewTokenMillis"라는 이름의 key에 System.currentTimeMillis().toString()란 value를 담아

    addFlags로 앱이 죽어있다면 깨우는 Intent.FLAG_INCLUDE_STOPPED_PACKAGES 플래그도 추가해

    Broadcast를 발송하는 코드입니다.

     

    암시적 브로드캐스트 발송

    Intent().also { intent ->
        intent.action = "com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB"
        intent.putExtra("onNewTokenMillis", System.currentTimeMillis().toString())
        intent.data = (Uri.parse("package:${this.packageName}"))
        intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
        sendBroadcast(intent)
    }

    com.example.broadcast.ON_NEW_TOKEN_AUTO_POPUP_LIB 이라는 이벤트에

    "package:${this.packageName}"을 intent.data에 담고,

    "onNewTokenMillis"라는 이름의 key에 System.currentTimeMillis().toString()란 value를 담아

    addFlags로 앱이 죽어있다면 깨우는 Intent.FLAG_INCLUDE_STOPPED_PACKAGES 플래그도 추가해

    Broadcast를 발송하는 코드입니다.

     

     

    글이 길어져서, Broadcast를 수신하는 BroadcastReceiver는 다음 글에서 설명하도록 하겠습니다.

    Broadcast recevier란? 사용법과 예제 - https://greensky0026.tistory.com/218


    참고 사이트

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

     

    브로드캐스트 개요  |  Android 개발자  |  Android Developers

    브로드캐스트 개요 Android 앱은 Android 시스템 및 기타 Android 앱에서 게시-구독 디자인 패턴과 유사한 브로드캐스트 메시지를 받거나 보낼 수 있습니다. 관심 있는 이벤트가 발생할 때 이러한 브로

    developer.android.com

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

     

    암시적 브로드캐스트 예외  |  Android 개발자  |  Android Developers

    백그라운드 제한에서 제외되는 암시적 브로드캐스트입니다.

    developer.android.com

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

     

    백그라운드 실행 제한  |  Android 개발자  |  Android Developers

    Android 8.0 이상을 대상으로 하는 앱에 대한 새로운 백그라운드 제한.

    developer.android.com

     

    반응형
    저작자표시 비영리

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

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

      티스토리툴바