본문 바로가기
안드로이드

[Android] 위젯 먹통 해결

by 코딩히어로 2022. 1. 11.
728x90

제목


안드로이드 진형은 OS 버전이 바뀔 때 꼭 정책이 바뀌고 

이 정책은 개발자들의 프로그램에 영향을 줍니다.

 

그래서 안드로이드 OS 버전이 업데이트 될때 개발자들은 두기를 활짝 열고 어떤 점이 바뀌고

적용해야 하는지를 유심히 봐야합니다.

 

자 그럼 제가 겪었던 문제에 대해 알아보겠습니다.

아래 보시는 그림은 회사에서 만든 어플 위젯으로 4개의 버튼이 있으며 위젯은 이 버튼에 따라 동작을 하게 됩니다.

 

설명1

 

지금까지 아주 잘 사용했습니다 지금까지 말이죠.

 

그러던 어느 날 안드로이드 진형에서 OREO라고 하는 맛있는 이름의 OS를 출시하게 됩니다.

OREO라.. 본디 OREO라 하면 아래와 같은 생각을 누구나 할 거라 생각합니다.

 

설명2

 

참 맛있게 생겼습니다 그래서일까요.. 먹성을 타고난 안드로이드란 놈이 결국 이 국민과자

OREO마저 먹어 삼킵니다.. 광고 아닙니다.

 

설명3

 

보란 듯이 몸퉁을 OREO로 만들어버린 이 안드로이드 덕분에 위젯이 먹통이 됩니다.

먹통이 된 내용의 소스코드는 아래와 같습니다.

 

설명4

 

위 그림은 4개의 위젯 버튼을 Intent를 통해 호출받고 이벤트를 등록해 주는 부분입니다.

네 그렇습니다 안드로이드 8.0 탐욕스러운 OREO란 놈이 등장하기 전까지는

아무 이상 없이 아~~~~ 주 잘 동작하던 코드입니다.

 

하지만 OREO는 결국 정책이 바뀌며 백그라운드 실행 제한 및 배터리 관련된 모든

행동들에 대해 제약을 걸고 차단을 합니다.

 

설명5

https://developer.android.com/about/versions/oreo/android-8.0-changes?hl=ko

 

그에 대한 내용은 위 링크에 자세하게 나와있으니 참고하시면 됩니다.

자 그럼 이러한 정책에서 위 소스코드가 문제가 되는 점이 무엇인가?

 

바로 암시적 Intent는 허용되지 않는다는 점입니다.

이 암시적 Intent를 명시적 Intent로 변경해 주시만 하면 문제를 해결할 수 있습니다.

 

아니 이보시오 암시가 명시적이 뭐 어쩌고 어째 또 Intent는 뭔 소리란 말이오!..

Inent는 강좌에서 따로 자세히 설명드리겠습니다.

 

일단 오늘은 간단하게 아래와 같이만 이해하시면 됩니다.

Intent 란 앱에서 무언가 작업을 수행하기 위해 사용하는 일종의 전달수단 입니다.

 

명시적 Intent란 특정 컴포넌트나 액티비티가 명확하게 지정되어 있는 Intent입니다.

암시적 Intent란 특정 컴포넌트나 액티비티를 지정하지 않고 어떤 기능을 지원하는

다수의 앱들을 대상으로 하는 Intent입니다.

 

뭐래니 진짜 너무 어렵게 설명하는 거 아니냐.. 네 제가 봐도 어렵네요 하지만 Intent 내용을 여기서 다루면 

내용이 너무 많아지므로 이번 글의 핵심은 OREO 이놈의 정책 변경에 따른 위젯 문제를 해결하는데 초점을 맞추고

나머지 자세한 내용은 따로 강좌를 통해 올리도록 하겠습니다.

 

자 다시 Intent를 생성하는 소스를 보겠습니다.

 

설명6

 

OREO에서 문제가 되었던 부분이 위 그림의 빨간 부분입니다.

왜냐..? Intent에게 ACTION_ENGINESTART 의 액션을 가진 놈이라고 기능적인 Intent, 즉 암시적 Intent를 지정했고

아까도 말한 거처럼 OREO는 배터리 정책 등 어쩌고 저쩌고 정책상 이 암시적 Intent를 허용하지 않는다는 것이죠.

 

자 그럼 어떻게 바꾸면 되는가

 

설명7

 

위 그림과 같이 변경하면 아주 간단하게 해결이 됩니다.

왜 뭔데 뭔 차인데..?

 

Intent를 생성할 때 context와 AppWidget.class를 직접적으로 지정해 주고 Action을 지정한 Intent에 넣어줍니다.

즉 Intent가 호출될 때 AppWidget.class의 ACTION_ENGINESTART를 호출시켜!!

라고 지정해서 알려주는 명시적 Intent가 되는 것이죠.

 

앞으로 OREO 이상의 버전에서는 암시적 Intent를 사용하시기보다는 명시적으로 지정해서 사용하시면

이러한 먹통 현상에 대응할 수 있을 거라고 생각합니다.

728x90
반응형

댓글