Android O service

안드로이드 앱을 테스트 하다보면 주로 낮은 버전의 기계가 문제가 많으므로 상위버전 OS 테스트는 잘 안하게 되는데 최신 버전인 안드로이드 O버전(API 26)에서 서비스관련 내용이 바뀌었다. 조금 바뀐것이 아니라 정책이 바뀌어서 예전 방식으로는 동작을 안했다.

다른 앱의 Service를 호출 할때 startService를 사용하는데 안드로이드 O이상에서는 이렇게 부르면 다른앱이 실행중이 아닌경우 서비스 호출을 실패한다. 안드로이드 O 문서에 보면 아래와 같은 내용이 나온다.

Android 8.0 이전에 포그라운드 서비스를 생성하는 일반적인 방법은 백그라운드 서비스를 생성한 후 이 서비스를 포그라운드로 승격시키는 것이었습니다. Android 8.0에서는 좀 복잡하며, 시스템은 백그라운드 앱이 백그라운드 서비스를 생성하는 것을 허용하지 않습니다. 이 때문에 Android 8.0에서는 새 서비스를 포그라운드에서 시작하는 새로운 메서드 Context.startForegroundService()를 소개합니다. 시스템이 서비스를 생성한 후, 앱은 5초 이내에 해당 서비스의 startForeground() 메서드를 호출하여 새 서비스의 알림을 사용자에게 표시해야 합니다. 앱이 이 시간 한도 내에 startForeground()를 호출하지 않으면 시스템이 서비스를 중단하고 이 앱을 ANR로 선언합니다.

복잡한 이야기인데 결론적으로 startForegroundService를 호출 하지 않으면 백그라운드 앱은 백그라운드 서비스를 생성하지 못한다는 것이다. 그러므로 백그라운드에 있더라도 서비스가 호출 되어야 한다면 startForegroundService를 사용해야 한다. 이 경우 위 설명에 있는 바와 같이 호출된 서비스는 startForground를 반드시 실행해야한다. startForground는 노티피케이션을 동반하므로 조용히 실행될 수는 없다. 이렇게 한 이유는 정확히 실행되는 서비스들을 사용자에게 보여주기 위함일 것이다.

안드로이드 P(API 28)에서는 이부분이 좀 더 강화 되어 startForegroundService를 사용하려면 별도 퍼미션까지 요구한다고 한다. 그렇지만 실제로 해보니 퍼미션 요구는 안하는데 좀 더 들여다 봐야 할 것 같다.

여담으로 안드로이드 P를 테스트 하기 위해서 에뮬레이터(Pixel XL)를 설치 했는데 에뮬레이터 상태에서도 정말 빠르다. 에뮬레이터에서 개발하는 분들에게는 이 버전을 추천한다.

 

Leave a Reply

Your email address will not be published. Required fields are marked *