2016-07-08 16 views
0

Ich habe einige Google Code-Implementierungen gesehen, bei denen die Dienste oder IntentServices über BroadcastReceiver gestartet werden. Ich kann nicht verstehen, gibt es einen technischen Grund dafür oder nicht? Der einzige Code, der den Dienst startet, ist die Überprüfung, ob der ContentProvider NULL ist oder nicht.Was ist der Punkt, um den Service oder IntentService über BroadcastReceiver zu starten?

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

p.s. Eine Sache, die ich bezweifle, ist die Leistung, wenn der Service-Start ist ein bisschen teurer, als der BroadcastReceiver, aber ich bin mir nicht sicher, warum ich möchte einige Experten Meinung über diese hören :) Ich will nur verstehen, wann zu tun dies und wenn nicht.

Antwort

1

BroadcastReceiver sind Listener in Ihrer App. Sie hören Ereignisse ab. Wenn sie ausgelöst werden, teilen sie anderen Komponenten mit, dass sie fortfahren sollen. Normalerweise kombiniert man BroadcastReceiver mit Diensten, so dass der erste mehrfach durch verschiedene Ereignisse ausgelöst werden kann, der später weiß, wann er etwas tun muss (zB Broadcast-Startdienst mehrmals basierend auf Ereignissen, aber da der Dienst bereits etwas verarbeitet) , es ignoriert einfach weitere Anrufe, bis es fertig ist). Es kann auch Absichten häufen, aber das ist die Idee, sie haben unterschiedliche Zwecke.

+0

Danke für die Antwort, sehr nützliche Erklärung. – karate

2

Sie können das Android-System einen onReceive BroadcastReceiver durch IntentFilters auslösen lassen.

Zum Beispiel, wenn Sie in Benutzer interessiert sind zu ändern Bluetooth-Einstellung ihrer Geräts können Sie

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

und das System ruft tun automatisch die BroadcastReceiver wenn es passiert.

Dies ist nichts, was Sie mit einem Service oder IntentService * tun/können. Sie verwenden also den BroadcastReceiver, um ihn manuell über context.startService() im onReceive des Empfängers zu starten.

* Achtung: Um sicherzustellen, dass Ihre App sicher ist, verwenden Sie beim Starten eines Dienstes immer eine explizite Absicht und deklarieren Sie keine Intent-Filter für Ihre Dienste. Die Verwendung einer impliziten Absicht zum Starten eines Dienstes ist ein Sicherheitsrisiko, da Sie nicht sicher sein können, welcher Dienst auf die Absicht reagiert und der Benutzer nicht sehen kann, welcher Dienst gestartet wird.

+0

Danke für die Antwort. Für mich sehen dies und die Antwort von @Filipe sehr nützlich aus und ich denke, dass sie in einem kombiniert werden können, um eine vollständige Erklärung zu erhalten. – karate