2012-02-01 12 views
74

Estoy tratando de iniciar un BroadcastReceiver dentro de un Service. Lo que intento hacer es tener un fondo ejecutando service que recoge los mensajes de texto entrantes y registra las llamadas entrantes. Pensé que la mejor manera de hacerlo es tener un service en ejecución que incorpora un receptor de difusión que puede catalogar cualquiera.Receptor de difusión dentro de un servicio

¿Cómo puedo hacer esto? Ya tengo mi servicio en funcionamiento.

Respuesta

106

como su servicio ya está configurado, sólo tiene que añadir un receptor de radiodifusión en su servicio:

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

en su servicio onCreate hacer esto:

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

y de onDestroy su servicio:

unregisterReceiver(receiver); 

y está listo para recibir la transmisión de lo que e ver los filtros que mencionas en onStartCommand. Asegúrese de agregar cualquier permiso si es necesario. por ej.

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

Quiero mostrar mensaje de aviso emergente, mientras que las llamadas entrantes. Agregué este filter.addAction ("android.provider.Telephony.LISTEN_CALL_STATE"); entonces, ¿cómo mostrar tostadas? – Prasad

+0

He notado que no puedo pasar datos por intent.setData (myUri) mientras envío sendBroadcas (intento) y braoadcastReceiver no funciona en ese caso, ¿verdad? – deadfish

+0

No tengo mucha confusión sobre el ciclo de vida del servicio cuando tiene BroadcastReceiver (en mi caso, descargue BroadcastReceiver) –

23

El mejor patrón es crear un BroadcastReceiver independiente. Esto asegura que su aplicación puede responder a la transmisión, ya sea que se esté ejecutando Service o no. De hecho, el uso de este patrón puede eliminar por completo la necesidad de ejecutar Service de funcionamiento constante.

Registre el BroadcastReceiver en su Manifiesto y cree una clase/archivo separado para él.

Ej:

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

Cuando el receptor funciona, sólo tiene que pasar una Intent (Bundle) a la Service y responder a ella en onStartCommand().

Ej:

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

Deseo que la transmisión esté dentro del ciclo de vida del servicio, de modo que la aplicación solo consulte los mensajes/llamadas telefónicas de acuerdo con la línea de tiempo del servicio. ¿Este método lo habilita? parece que lo ha configurado para que la recepción de la transmisión active el servicio. – Utopia025

+0

Esta implementación iniciaría el 'Servicio' si no se estaba ejecutando, o pasaría un nuevo' Intento' si lo es (para la recuperación en 'onStartCommand'). Si solo desea que se ejecute cuando el 'Servicio 'está activo, puede habilitar/deshabilitar mediante programación el componente' Receptor' a través del 'setComponentEnabledSetting()' de 'PackageManager'. –

+3

La respuesta de Waqas puede ser su mejor opción, si solo desea que el 'Receptor' se active cuando se está ejecutando el' Servicio'. –

Cuestiones relacionadas