방송과 브로드캐스트 리시버(2)

·2021년 11월 12일
0

안드로이드

목록 보기
14/17

정적/동적 리시버 동작 제한

정적/동적 리시버는 방송을 시작할 때 전달하는 인텐트 플래그에 따라 동작하지 않을 수 있다.

FLAG_EXCLUDE_STOPPED_PACKAGES 인텐트 플래그

한번이라도 앱이 실행되어야만 정적 리시버가 동작할 수 있도록 한다
앱이 실행된다는 것은 안드로이드 기준에서 액티비티 실행을 의미하고, 사용자 입장에서는 홈에서 앱 실행을 의미한다.

  • 해당 플로그를 인텐트에 설정하지 않아도 기본으로 설정된다.
  • 사용자의 의도로 강제 종료된 상태의 앱은 더 이상 사용자 모르게 다시 동작할 수 없다.

FLAP_RECEIVER_REGISTERED_ONLY 인텐트 플래그

오직 동직 리시버만 방송을 수신할 수 있는 인텐트 플래그
-> 특정 앱의 정적 리시버가 백그라운드에서 몰래 실행되는 것을 막을 수 있다.

방송은 리시버만 등록하면 받을 수 있기 때문에 부하가 크다

  • 예를 들어 화면이 켜지고 꺼질 때마다 시스템은 그 사실을 방송한다.
    하지만 이 방송은 빈번히 일어나고 여러 앱에서 리시버를 많이 등록했다면 시스템의 성능상 문제가 발생될 수 있다.(스크린 온-오프를 할때에도 문제가 일어남)
    방송을 보내는 곳에서는 신중을 기해야한다.

빈번한 리시버 실행을 막는 방법

  • 한번도 실행되지 않은 앱은 리시버가 동작하지 않도록 FLAG_EXCLCUDE_STOPPED_PACKAGES 플래그를 기본으로 포함한다.
  • FLAG_RECEIVER_REGISTERED_ONLY로 등록된 리시버 중에 동적 리시버만 동작하게 한다.
  • 안드로이드 시스템에서 발송하는 방송들은 이 두가지 플래그를 포함시키는 경우가 많다.

FLAG_RECEIVER_REPLACE_PENDING 인텐트 플래그

중복해서 동일한 액션으로 방송될 경우 중복된 방송을 제거하는 기능

리시버의 동작 시간 제한

리시버도 메인 스레드에서 처리되기 때문에 제한시간이 존재한다. 즉, 제한시간 초과 시 ANR 발생한다.

  • 액티비티의 경우, 메인 스레드의 ANR 시간은 5초이다.

포그라운드와 백그라운드 방송은 뭘까?

  • 포그라인드 방송: FLAG_RECEIVER_FOREGROUND 플래그로 설정되고, 빠른 처리를 요하는 방송
  • 액티비티 매니저는 포그라운드 방송들을 우선 처리하고, 백그라운드 방송을 처리한다.
    포그라운드 방송은 우선순위가 높지만 ANR에 걸리는 시간이 작다. 그만큼 더 빨리 처리해야하기 때문이다.

리시버도 액티비티와 같은 메인 스레드를 사용하기 때문에 리시버가 늦게 동작하면 액티비티도 영향을 받게 된다.
-> 따라서 리시버 역시도 긴 시간이 걸리는 작업을 처리하려면 작업 스레드를 사용하거나 안드로이드 컴포넌트 중 서비스를 써야 한다.

리시버 호출 순서와 우선 순위

정적 리시버 호출 순서

정적 리시버는 동시에 처리되지 않는다.
-> 하나의 리시버 처리의 지연이 발생되면 이후 다른 리시버가 늦어지는 구조다.
-> 리시버 잧체는 메인 스레드에서 돌아가기 때문에 순서대로 호출되는 이유가 아니라도 절대 긴 작업을 처리하지 않도록 해야 한다.

동적 리시버의 호출 순서

정적 리시버와 달리 모든 리시버가 동시에 실행. 순서대로 실행되는 정적 리시버보다 빨리 처리된다. 끝나는 순서는 무작위로 정해진다.

동적/정적 리시버 우선순위 변경하기

인텐트 필터의 setPriority 함수를 사용하여 우선순위 1로 조정한다. 기본 우선순위는 0부터 시작하고 수치가 클수록 우선순위가 높다.

정적 리시버는 아래와 같이 우선순위 변경이 가능하다.

동적리시버는 sendOrderedBroadcast 함수를 사용하여 순서대로 처리하게 할 수 있다.
-> 이 함수를 통해서 특정 리시버가 방송을 수신했을 때 다른 리시버가 방송을 받지 못하도록 할 수 있다.

활용방법

문자가 오는 상황일때, 메시지 수신앱이 여러개일 경우 여러개의 방송이 나오게 되는데, 이때 가장 먼저 sms를 받은 앱이 리시버를 처리하고, 나머지 앱은 처리하지 않도록 중단할 수 있다.

profile

0개의 댓글