Tech & Programming/모바일(Android, Flutter)

android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground() 오류 해결

소스코드 요리사 2019. 10. 1. 10:01

최근 가로/세로 모드 방향전환이 가능하도록 가로모드 개발을 했습니다.

가로/세로 방향전환 시 최초 실행되는 MainActivity에서 아래와 같은 오류가 간헐적으로 발생했습니다.

 

2019-10-01 09:23:27.681 ~~~~~~~~~~~~~~~~~~~ /AndroidRuntime: FATAL EXCEPTION: main
    Process: ~~~~~~~~~~~~~~~~~~~
    android.app.RemoteServiceException: Context.startForegroundService() did not then call Service.startForeground()
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1791)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6709)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:769)

 

overstackflow와 일부 테스트를 거쳐 2가지 경우의 수에서 해당 이슈가 일어나는 것을 발견했습니다.

 

1. 오레오(SDK 26) 이후 Activity에서 Cotext.startForegroundService() 로 시작하게 되면, 5초 이내로 Service 인스턴스의 startForeground() 로 notification과 연결시켜야 하는데, 연결이 지연된 경우

 

2. Foreground 상태로 전환되기 전(실행되는 Service 인스턴스의 foreground 변수가 true 되기전)에  stopService() 가 호출 되고, Cotext.startForegroundService() 로 재시작 할 때 

 

제가 문제가 되었던 이유는 2번 때문이었습니다.

onResume() 단계에서 서버에 API를 호출하고 비동기 결과에 따라 서비스를 실행시키고,

onDestory()에서 이 서비스를 종료하는 로직이 들어가 있었습니다.

 

그렇다보니 가로/세로 방향전환 시 onResume과 onDestory 가 반복적으로 일어나면서 타이밍 이슈가 발생했었습니다.

 

문제 해결 방법은 아래와 같습니다.

1. foregroundService 안에서 stopserlf를 통해서 알아서 종료하게 만들거나 

2. onDestory와 onResume에서 service의 foreground 변수의 상태를 보고 실행 또는 종료를 시키도록 수정하여

문제 해결을 할 수 있었습니다.

 

혹시 동일한 문제로 원인을 찾고 있으신 분이 있다면 도움이 되시기를 바라며, 글을 맺습니다.

 

참조 사이트:

https://stackoverflow.com/questions/44425584/context-startforegroundservice-did-not-then-call-service-startforeground

about 서비스 : https://developer.android.com/guide/components/services?authuser=1