2012-02-01 11 views
74

Sto tentando di avviare uno BroadcastReceiver all'interno di uno Service. Quello che sto cercando di fare è avere uno sfondo in esecuzione service andando che raccoglie messaggi di testo in arrivo, e registra le chiamate telefoniche in arrivo. Ho capito che il modo migliore per farlo è avere un service in esecuzione che incorpori un ricevitore broadcast che può catalogare entrambi.Ricevitore di trasmissione all'interno di un servizio

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

risposta

106

come il vostro servizio è già messa a punto, è sufficiente aggiungere un ricevitore trasmissione nel vostro 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 
     }  
    } 
}; 

in del vostro servizio onCreate fare 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 del onDestroy vostro servizio:

unregisterReceiver(receiver); 

e siete a posto per ricevere la trasmissione per quale e i filtri che menzioni in onStartCommand. Assicurati di aggiungere qualsiasi autorizzazione, se necessario. per es.

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

voglio visualizzare un messaggio brindisi durante chiamata in arrivo. ho aggiunto questo filter.addAction ("android.provider.Telephony.LISTEN_CALL_STATE"); allora come si fa a mostrare brindisi. – Prasad

+0

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

+0

Sono poco confuso circa il ciclo di vita del servizio quando ha BroadcastReceiver (nel mio caso scarica BroadcastReceiver) –

23

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

Registrare il BroadcastReceiver nel manifesto e creare una classe/file separato per esso.

Esempio:

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

Quando il ricevitore viene eseguito, è sufficiente passare un Intent (Bundle) al Service, e rispondere ad essa in onStartCommand().

Esempio:

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

Desidero che la trasmissione sia compresa nel ciclo di vita del servizio, in modo che l'app esegua solo query di messaggi/telefonate in base alla linea temporale del servizio. Questo metodo lo abilita? sembra che tu l'abbia impostato in modo che la ricezione della trasmissione inneschi il servizio. – Utopia025

+0

Questa implementazione avvia il 'Servizio' se non era già in esecuzione, o passa un nuovo' Intento' se lo è (per il recupero in 'onStartCommand'). Se si desidera che venga eseguito solo quando 'Service' è attivo, è possibile attivare/disattivare a livello di codice il componente' Receiver' tramite 'SetComponentEnabledSetting()' di 'PackageManager'. –

+3

La risposta di Waqas potrebbe essere la tua migliore opzione, se vuoi che il 'Receiver' vivo quando il' Servizio' è in esecuzione. –

Problemi correlati