Rundfunkempfänger innerhalb eines Dienstes

90

Ich versuche ein BroadcastReceiverinnerhalb eines zu starten Service. Ich versuche, einen Hintergrund zu serviceerstellen, der eingehende Textnachrichten sammelt und eingehende Telefonanrufe protokolliert. Ich dachte, der beste Weg, dies zu tun, ist ein serviceLauf, der einen Rundfunkempfänger enthält, der entweder katalogisieren kann.

Wie mache ich das? Ich habe meinen Dienst bereits in Betrieb.

Utopia025
quelle

Antworten:

125

Da Ihr Dienst bereits eingerichtet ist, fügen Sie einfach einen Rundfunkempfänger zu Ihrem Dienst hinzu:

private final BroadcastReceiver receiver = new BroadcastReceiver() {
   @Override
   public void onReceive(Context context, Intent intent) {
      String action = intent.getAction();
      if(action.equals("android.provider.Telephony.SMS_RECEIVED")){
        //action for sms received
      }
      else if(action.equals(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED)){
           //action for phone state changed
      }     
   }
};

in Ihrem Dienst onCreatetun Sie dies:

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("your_action_strings"); //further more
filter.addAction("your_action_strings"); //further more

registerReceiver(receiver, filter);

und in Ihrem Dienst onDestroy:

unregisterReceiver(receiver);

und Sie sind gut darin, Sendungen für alle Filter zu empfangen, die Sie in erwähnen onCreate. Stellen Sie sicher, dass Sie bei Bedarf eine Berechtigung hinzufügen. für zB

<uses-permission android:name="android.permission.RECEIVE_SMS" />
Waqaslam
quelle
Ich habe festgestellt, dass ich beim Senden von sendBroadcas (intent) keine Daten durch intent.setData (myUri) übergeben kann und braoadcastReceiver in diesem Fall nicht funktioniert, stimmt das?
Deadfish
Ich bin wenig verwirrt über den Lebenszyklus, wenn es BroadcastReceiver hat (in meinem Fall BroadcastReceiver herunterladen)
Android Man
1
@waqaslam Haben Sie diesen BroadcastReceiver in Ihrem Manifest festgelegt?
IgorGanapolsky
2
@IgorGanapolsky Nein, Sie müssen solche Empfänger nicht im Manifest registrieren.
Waqaslam
2
@SayyedRizwan Ihr Dienst und BroadcastReceiver werden unter demselben Prozess und höchstwahrscheinlich unter demselben Thread ausgeführt (es sei denn, Sie erstellen einen neuen). Der Batterieverbrauch hängt davon ab, wie Sie Ihren Thread (Hintergrund / Vordergrund) definiert haben und wie viele Sendungen
eingehen
23

Das bessere Muster besteht darin, ein eigenständiges Muster zu erstellen BroadcastReceiver. Dies stellt sicher, dass Ihre App auf die Sendung reagieren kann, unabhängig davon, ob die Sendung ausgeführt wird oder nicht Service. Tatsächlich kann die Verwendung dieses Musters die Notwendigkeit eines konstanten Laufens Serviceinsgesamt beseitigen.

Registrieren Sie das BroadcastReceiverin Ihrem Manifest und erstellen Sie eine separate Klasse / Datei dafür.

Z.B:

<receiver android:name=".FooReceiver" >
    <intent-filter >
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

Wenn der Empfänger läuft, übergeben Sie einfach ein Intent( Bundle) an das Serviceund antworten darauf in onStartCommand().

Z.B:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}
Paul Burke
quelle
6
Ich möchte, dass die Sendung innerhalb des Lebenszyklus des Dienstes liegt, sodass die App nur Nachrichten / Telefonanrufe gemäß der Dienstzeitleiste abfragt. Ermöglicht diese Methode das? Es sieht so aus, als hätten Sie es so eingerichtet, dass der Empfang der Sendung den Dienst auslöst.
Utopia025
Diese Implementierung würde das starten, Servicewenn es nicht bereits ausgeführt wurde, oder ein neues übergeben, Intentwenn dies der Fall ist (zum Abrufen in onStartCommand). Wenn Sie möchten, dass es nur ausgeführt wird, wenn es aktiv Serviceist, können Sie die ReceiverKomponente programmgesteuert über die PackageManager's aktivieren / deaktivieren setComponentEnabledSetting().
Paul Burke
4
Die Antwort von Waqas kann Ihre beste Option sein, wenn Sie nur das ReceiverLeben wollen , wenn das Serviceläuft.
Paul Burke
3
Wenn Sie keine Aktivität haben, funktioniert sie nicht für API 3.1 und höher: ashimita.blogspot.com.tr/2012/04/…
elif
1
Ab Android 3.1 schließt das Android-System standardmäßig alle Empfänger vom Empfang von Absichten aus, wenn die entsprechende Anwendung vom Benutzer noch nie gestartet wurde oder wenn der Benutzer die Anwendung explizit über das Android-Menü gestoppt hat. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik