2014-12-03 6 views
0

내 응용 프로그램에서 응용 프로그램이 시작될 때 서비스가 시작되고 응용 프로그램이 닫힐 때까지 (START_STICKY 사용) 서비스가 중지됩니다. 현재 서비스 바인딩 및 바인딩 해제와 통신해야하는 여러 구성 요소가 있습니다. 내 생각은 이제 단순히 인 텐트가 서비스와 통신 할 수있게 할 때 바인딩하고 바인딩 해제하는 것을 괴롭히는 이유입니다.서비스와 상호 작용

내 구성 요소가 서비스에 의도를 보내면 서비스가 지속적으로 작동하는 경우 바인딩하는 것이 더 좋습니다. 구성 요소가 의도를 간단히 작성하고 시작 서비스를 호출하므로 이점이 덜 복잡한 코드임을 알 수 있습니다.

+1

제가 바인딩을 활용했다는 것을 생각할 수있는 유일한 시간은 서비스 및/또는 액티비티에 다른 종류의 의존성이 있기를 원할 때입니다. 그렇지 않으면 많은 통신이 발생합니다. 그것은 당신을위한 경우가 아닌 것처럼 들리므로 Intents가 잘 작동한다고 생각할 것입니다. – zgc7009

+0

내 구성 요소가 서비스의 이벤트에 반응해야하는 경우 바인드하여 수신기로 추가하는 것이 좋습니다. 내가 묶어 야 할 /해야하지 않을 때 알아 내려고 노력 중입니다 –

+0

"바운드 서비스"문서를 읽으셨습니까? "로컬 바운드 서비스"의 경우가 특히 흥미 롭습니다. – pskink

답변

1

다른 사람들이 설명에 언급했듯이 여러분의 요구에 달려 있습니다. 바인더 방식을 사용하면 서비스와 직접 연결되어 직접 호출과 같은 모양을 만들 수 있습니다. 실제로는 동일한 프로세스에있는 경우입니다. Intent을 통신에 사용하면 통신 메커니즘이 더 많은 메시지 기반이라는 것을 의미합니다 다른 Intent 페이로드를 처리해야합니다. 또한 startService() 또는 startActivity() 또는 sendBroadcast()을 호출하면 system_server에서 실행되는 ActivityManagerService으로 끝나기 때문에 일부 추가 오버 헤드가 발생합니다. 또 다른 방법은 Intent을 사용하여 ServiceActivity 사이의 연결을 설정하고 모두 Messenger을 사용하여 메시지를주고받을 수 있습니다. 순수 Intent 메커니즘과 비슷하지만 Messenger 개체를 교환하면 ActivityManagerService에서 더 이상 관여하지 않습니다.

+0

입력 해 주셔서 감사합니다. 메신저 및 ActivityManagerService 클래스를 자세히 확인하여 더 나은 아이디어를 얻으실 수 있습니다. –

+0

도와 주셔서 감사합니다. 이것이 작동하는 한'ActivityManagerService'에 대해서는별로 알지 못할 것입니다. 서비스 시작/중지를 호출 할 때 'Context' 객체, 활동을 시작합니다. 요청한 것을 수행하기 위해 활동 관리자 서비스와의 모든 통신. –

0

예 데이터를 의도로 서비스에 보내고 onStartCommand 또는 OnBind에서 의도를 처리하는 것은 매우 직접적인 방법입니다. 문제점은 서비스가 활동 단편과 다시 통신하는 방법입니다.

메신저 서비스는 모든 나가는 메시지의 사본을 서비스에 바인딩 된 모든 클라이언트에 보낼 수 있고 인 텐트에서와 동일한 데이터 번들을 전달할 수 있다는 장점이 있습니다.

http://developer.android.com/guide/components/bound-services.html#Messenger

상기 예

앞뒤로 메시지와 함께 데이터의 묶음을 전송하도록 수정 될 수있다.