티스토리 뷰

728x90



Android target SDK 를 Android O(API level 26) 이상으로 하고 기존의 암시적 브로드캐스트(Implicit broadcast) 를 manifest 에 등록하여 이용한 widget 의 pending intent 를 처리하면 아래와 같은 warning 이 발생하면서 정상동작을 안 한다.

W/BroadcastQueue: Background execution not allowed: receiving Intent ......

 

Android O 부터 암시적 브로드캐스트 인텐트 제한이 적용되었기 때문이다.

명시적 브로드캐스트 vs 암시적 브로드캐스트

  • 명시적 브로드캐스트 (Explicit broadcast)
    • 인텐트에 클랙스 객체나 컴포넌트 이름을 지정하여 호출
    • 특정 컴포넌트나 액티비티가 명확하게 실행되야 하는 경우
  • 암시적 브로드캐스트 (Implicit broadcast)
    • 인텐트의 액션과 데이터를 지정하여 호출
    • 호출할 대상이 명확하지 않아 안드로이드 시스템이 적절한 컴포넌트를 찾아 실행되야 하는 경우

앱이 브로드캐스트를 등록하면 브로드캐스트가 보내질 때 마다 리소스를 소모하게 된다. 앱이 system event 에 관련된 너무 많은 브로드캐스트를 등록한다면 문제의 원인이 될 수 있다.

하나의 system event 로 인해 모든 앱이 빠르게 연속적으로 리소스를 소비하게 되어 사용자 환경이 나빠질 수 있다. 

이 문제를 해결하기 위해 Android N(API level 25) 부터 broadcast 를 제약하는 규칙이 제공되는데, 그 제약이 Android O(API level 26) 부터는 더 강화된 것이다.

따라서 Android O(API level 26) 를 target 으로 하는 앱들은 더이상 Manifest 에 등록한 암시적 브로드캐스트를 받을 수 없다.

이를 해결하기 위해 기존 암시적 브로드캐스트를 명시적 브로드캐스로 변환해서 사용하면 된다.

  • 브로드캐스트를 동적으로 등록하거나, jobScheduler 를 이용하는 방법도 있다.

[Before]

 

[After]



728x90
댓글