Frage Empfänger innerhalb eines Dienstes senden


Ich versuche ein zu starten BroadcastReceiver innerhalb eines Service. Was ich versuche zu tun, ist einen Hintergrund zu haben service Gehen, die eingehende Textnachrichten sammelt und eingehende Anrufe protokolliert. Ich dachte, der beste Weg, dies zu tun, ist ein service läuft, die einen Rundfunkempfänger enthält, der beides katalogisieren kann.

Wie gehe ich dabei vor? Ich habe meinen Service bereits eingerichtet.


76
2018-02-01 07:10


Ursprung


Antworten:


Da Ihr Dienst bereits eingerichtet ist, fügen Sie einfach einen Broadcast-Empfänger in Ihren Dienst ein:

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 deinem Dienst onCreate mach das:

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 deinem Dienst onDestroy:

unregisterReceiver(receiver);

und Sie sind gut, um Broadcast zu empfangen, für was auch immer Filter Sie in erwähnen onCreate. Stellen Sie sicher, dass Sie bei Bedarf eine Berechtigung hinzufügen. für z.B.

<uses-permission android:name="android.permission.RECEIVE_SMS" />

110
2018-02-01 07:23



Das bessere Muster besteht darin, ein Standalone zu erstellen BroadcastReceiver. Dies stellt sicher, dass Ihre App auf die Übertragung reagieren kann, unabhängig davon, ob die Service läuft. In der Tat kann die Verwendung dieses Musters die Notwendigkeit eines Konstantenlaufs beseitigen Service insgesamt.

Registrieren Sie die BroadcastReceiver in 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) zum Serviceund darauf antworten onStartCommand().

Z.B:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}

23
2018-02-01 07:29