티스토리 뷰
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]
'Android > Troubleshooting' 카테고리의 다른 글
[ADB] INSTALL_FAILED_ALREADY_EXISTS (0) | 2020.03.19 |
---|---|
getColor, getDrawable deprecated (0) | 2020.01.30 |
[ADB] error: more than one device/emulator (0) | 2019.05.17 |
This view is not constrained (0) | 2019.01.16 |
AppWidgetProvider 의 onEnable/onDisabled 가 호출되지 않을 때 (0) | 2019.01.11 |
- Total
- Today
- Yesterday
- 무료 채굴
- Android Service
- StartService
- registerForContextMenu
- p2e
- 안드로이드 인텐트
- StringUtils
- android activity flag
- 리워드앱
- BroadcastReceiver
- Intent
- M2E
- notifyDataSetChanged
- 채굴앱
- 앱테크 추천
- mPANDO
- 안드로이드 서비스
- onContextItemSelected
- RoomDatabase
- bindservice
- 무료채굴
- task
- onCreateContextMenu
- 리워드 어플
- android intent
- android flag activity
- android task
- task 생성
- WEMIX
- 앱테크
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |