AIDL 로 서비스를 구현해서 B activity와 C activity 에서 같은 service 를 bind 하여 사용중입니다.
총 activity 는 세개로 구성되어 있으며 A <=> B <=> C 로 이동을 합니다.
B 와 C activity 전환은 flag 를 Intent.FLAG_ACTIVITY_REORDER_TO_FRONT|Intent.FLAG_ACTIVITY_SINGLE_TOP 사용하며
B에서 종료를 클릭하면 Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP flag 를 사용하여 B 와 C 를 종료 합니다.
B 와 C 의 onDestroy 에서 super.onDestroy(); unbindService(srvConn); 이런식으로 서비스 종료를 하고 있는데..
종료후 A activity에서 일정 시간을 머무르고 있으면 아래와 같이 에러가 발생을 하네요.
ANR in 패키지명
Reason: Executing service 서비스 클래스명
B 와 C 에서 같은 서비스를 bind 후 종료를 같이 해서 발생할거라는 생각은 있는데... 피하는 방법이 궁금하네요.
헤드샷님 답변 감사 합니다.
다만 문제의 답은 아니네요.
AIDL 사용하시는 분들을 위해 자답 적습니다.
제가 범한 오류는 bindservice 를 onresume 에서 호출 하고 unbindservice 를 ondestory 에서 호출 해줘서 생기는 문제 였습니다.
결론은 bindservice 호출 횟수 만큼 unbindservice 를 호출해주어야 한다는 이야기가 되겠네요.
그래서 oncreate 시 bindservice 하면 ondetory 에서 unbindservice 를 해주고 onresume에서 bindservice 를 하면 onpause 에서 unbindservice 를하시면 되겠습니다.(자원공유를 위해서는 약간의 추가 로직이 필요 하겠네요)
궁금증이 증폭 되는 부분이 B에서 최초 bindservice 할때는 서비스의 onbind 가 호출이 되어지지만 실행 중인 서비스를 C 에서 bindservice 를 하니 서비스의 onbind 가 호출이 없어 onrebind 도 해보니 역시 호출이 없더군요. 물론 C에서 bind 는 되어집니다.
그럼에도 불구 하고 unbindservice 는 bindservice 한만큼 해줘야 한다는게 내부적으로 처리를 하는게 있는가 싶습니다.
그럼 즐코 하세요.




싱글톤으로 바인드해서 사용하시는게 맞습니다.
아니면 application class에서 처리를 해도 되고요