2016-07-08 1 views
0

BroadcastReceiver를 통해 서비스 또는 IntentServices가 시작되는 일부 Google 코드 구현을 보았습니다. 나는 기술적 인 이유가 있는지 없는지 이해할 수 없다. 서비스 시작을 중지시키는 유일한 코드는 ContentProvider가 null인지 여부입니다.BroadcastReceiver를 통해 서비스 또는 IntentService를 시작하는 요령은 무엇입니까?

if(provider == null) { 
    // the provider is not initialised, yet... 
    return; 
} 

p.s. 내가 의심하는 한가지는 서비스 시작이 BroadcastReceiver보다 조금 비싸지 만 성능에 대한 것이므로 전문가의 의견을 듣고 싶습니다. 언제 할 것인지 이해하고 싶습니다. 이 때와 그렇지 않은 경우.

답변

1

BroadcastReceivers는 앱의 수신기입니다. 당신은 그들이 이벤트를 듣게하고, 트리거되었을 때, 그들은 다른 구성 요소들에게 진행하도록 지시합니다.

일반적으로 BroadcastReceivers를 서비스와 결합하여 처음에는 여러 이벤트에 의해 여러 번 트리거 될 수 있으며 나중에는 언제든지 처리할지 여부를 알 수 있습니다 (예 : 이벤트를 기반으로 여러 번 브로드 캐스트 서비스를 시작하지만 서비스에서 이미 처리중인 , 그것은 단지 끝날 때까지 추가 호출을 무시합니다). 그것은 또한 의도를 쌓을 수 있지만, 그 아이디어는 다른 목적을 가지고 있습니다.

+0

답변 주셔서 감사합니다. 매우 유용한 설명입니다. – karate

2

당신은 안드로이드 시스템이 IntentFilters를 통해 BroadcastReceiver의 onReceive을 트리거하도록 할 수 있습니다.

당신이 그들의 기기의 블루투스 설정을 변경하는 사용자에 관심이 있다면 예를 들어,

<receiver android:name=".BTSettingsChangedReceiver"> 
    <intent-filter> 
     <action android:name="android.bluetooth.adapter.action.STATE_CHANGED" /> 
    </intent-filter> 
</receiver> 

을 할 수 있으며이 발생했을 때 시스템은 자동으로 브로드 캐스트 리시버를 호출합니다.

이것은 서비스 또는 IntentService *로 할 수 있거나 할 수있는 것이 아닙니다. 따라서 BroadcastReceiver를 사용하여 수신기의 onReceivecontext.startService()을 수동으로 시작하십시오.

주의 : 앱이 안전한지 확인하려면 서비스를 시작할 때 항상 명시적인 의도를 사용하고 서비스에 의도 필터를 선언하지 마십시오. 어떤 서비스가 의도에 응답 할 것인지 확신 할 수 없기 때문에 암시적인 의도를 사용하여 서비스를 시작하면 사용자가 어떤 서비스가 시작되는지 알 수 없으므로 보안 위험이 있습니다.

+0

답해 주셔서 감사합니다. 나에게 이것은 @Filipe의 대답과 그에 대한 답을 매우 유용하게 보이며, 나는 완전한 설명을하기 위해 하나로 결합 될 수 있다고 생각한다. – karate

관련 문제