스터디/Android+Java

Android Service Bind가 안될때 해결방법

Dalmangyi 2017. 10. 7.

bindService가 안될때 클래스명이나 매니페스트가 잘못됬나 하지만 그렇지 않은 경우가 발생해서 많이 해매서 이렇게 포스트로 남깁니다.


startService(new Intent("emersys.co.kr.maven.voice.service.REMOTE_SERVICE"));

bindService(new Intent(IRemoteService.class.getName()), mConnection, Context.BIND_AUTO_CREATE);


위는 일반적으로 많이 퍼진 Service Bind방법입니다.

전혀 문제가 없는 코드지만 bind는 제대로 되지 않습니다. 


SDK 2.3부터는 Context에 많은 신경을 써서 그런지 저 상태의 코드로는 실행이 되지 않습니다.

그래서 getApplicationContext().bindService(new Intent(IRemoteService.class.getName()), mConnection, 

Context.BIND_AUTO_CREATE); 로 교체해야합니다.


이때 의문점이 드는 것은 왜 bindService()가 안되냐는 것입니다.

bindService()는 this.bindService()와 같으며 getBaseContext().bindService() 와 같습니다.



BaseContext는 1개의 Process에 대한 private한 Activity의 Context입니다.

AppilicationContext는 어플 전체의 모든 Process에 대한 public한 Context입니다.

'메모리 유지를 피하기 위해서 getBaseContext를 사용한다는 글을 보았는데.. 글쎄요.. 국내 검색결과 모두.. 같은 설명뿐이군요. '

this에 의한 Context는 BaseContext와 같습니다.

그렇지만 안드로이드 OS에서는 메모리에 대한 정확한 이해없이 메모리에 관련된 시나리오를 작성해서 실행에 옮기지 말라고 권하고 있습니다. 그래서 getBaseContext는 왠만하면 사용하지 않는 것이 좋습니다. 액티비티가 꺼졌다 켜지고,.. 어플이 수시로 반복되어 종료되었다 살아나는 작업으로 인해 잘못된 결과를 발생시킬수도 있으니 말입니다.


-Context 참고링크 : 

http://stackoverflow.com/questions/1026973/android-whats-the-difference-between-the-various-methods-to-get-a-context




Bind하는 과정 자체가 다른 Process에 대한 연결 작업을 의미하고

이를 좀 더 명확히 해주기 위해서 getApplicationContext().bindService()를 써야 합니다.

결국 bindService()가 자신이 필요한 Context를 제대로 찾지 못해서 생기는 버그가 아닌 버그에 의해 생긴 현상입니다.

댓글