Ricevitore di trasmissione all'interno di un servizio


90

Sto cercando di avviare un BroadcastReceiverall'interno di a Service. Quello che sto cercando di fare è avere uno sfondo in esecuzione serviceche raccoglie i messaggi di testo in arrivo e registra le chiamate telefoniche in arrivo. Ho pensato che il modo migliore per farlo fosse avere una servicecorsa che incorpori un ricevitore di trasmissione in grado di catalogare entrambi.

Come procedo a fare questo? Ho già il mio servizio attivo e funzionante.

Risposte:


127

poiché il tuo servizio è già configurato, aggiungi semplicemente un ricevitore di trasmissione nel tuo servizio:

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
      }     
   }
};

nel tuo servizio onCreatefai questo:

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);

e nel tuo servizio onDestroy:

unregisterReceiver(receiver);

e sei a posto per andare a ricevere la trasmissione per i filtri che hai menzionato onCreate. Assicurati di aggiungere eventuali autorizzazioni se necessario. per es

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

Ho notato che non posso passare i dati tramite intent.setData (myUri) durante l'invio di sendBroadcas (intent) e braoadcastReceiver non funziona in questo caso, è giusto?
deadfish

Sono un po 'confuso sul ciclo di vita del servizio quando ha BroadcastReceiver (nel mio caso scarica BroadcastReceiver)
Android Man

1
@waqaslam Hai impostato questo BroadcastReceiver nel tuo Manifest?
IgorGanapolsky

2
@IgorGanapolsky No, non è necessario registrare tali ricevitori in manifest.
Waqaslam

2
@SayyedRizwan Il tuo servizio e BroadcastReceiver verranno eseguiti con lo stesso processo e molto probabilmente lo stesso thread (a meno che tu non ne crei uno nuovo). Il consumo della batteria dipende da come hai definito il tuo thread (sfondo / primo piano) e dalla quantità di trasmissioni in arrivo.
waqaslam

24

Il modello migliore è creare uno standalone BroadcastReceiver. Ciò assicura che la tua app possa rispondere alla trasmissione, indipendentemente dal fatto che Servicesia in esecuzione o meno . In effetti, l'utilizzo di questo modello può eliminare del tutto la necessità di un funzionamento costante Service.

Registra il file BroadcastReceivernel tuo manifest e crea una classe / file separato per esso.

Per esempio:

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

Quando il ricevitore è in esecuzione, passa semplicemente una Intent( Bundle) a Servicee rispondi ad essa onStartCommand().

Per esempio:

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

6
Voglio che la trasmissione rientri nel ciclo di vita del servizio, in modo che l'app interroghi solo messaggi / telefonate in base alla linea temporale del servizio. Questo metodo lo consente? sembra che tu l'abbia impostato in modo che la ricezione della trasmissione inneschi il servizio.
Utopia025

Questa implementazione inizierebbe Servicese non era già in esecuzione, o ne passerebbe una nuova Intentse lo è (per il recupero onStartCommand). Se vuoi che venga eseguito solo quando Serviceè attivo, puoi abilitare / disabilitare a livello di programmazione il Receivercomponente tramite PackageManageri file setComponentEnabledSetting().
Paul Burke

4
La risposta di Waqas potrebbe essere la tua migliore opzione, se vuoi solo il Receivervivo quando Serviceè in esecuzione.
Paul Burke

3
Se non hai un'attività, non funzionerà per API 3.1 e versioni successive: ashimita.blogspot.com.tr/2012/04/…
elif

1
A partire da Android 3.1 il sistema Android esclude di default tutti i ricevitori dalla ricezione degli intenti se l'applicazione corrispondente non è mai stata avviata dall'utente o se l'utente ha fermato esplicitamente l'applicazione tramite il menu Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.