Receptor de difusión dentro de un servicio

90

Estoy tratando de iniciar un BroadcastReceiverdentro de a Service. Lo que estoy tratando de hacer es tener una ejecución en segundo plano serviceque recopile los mensajes de texto entrantes y registre las llamadas telefónicas entrantes. Pensé que la mejor manera de hacerlo es tener un servicefuncionamiento que incorpore un receptor de transmisión que pueda catalogar cualquiera de los dos.

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

Utopía025
fuente

Respuestas:

127

como su servicio ya está configurado, simplemente agregue un receptor de transmisió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 onCreatehaga 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 en tu servicio onDestroy:

unregisterReceiver(receiver);

y está listo para recibir la transmisión de los filtros que mencione onCreate. Asegúrese de agregar cualquier permiso si es necesario. por ejemplo

<uses-permission android:name="android.permission.RECEIVE_SMS" />
waqaslam
fuente
He notado que no puedo pasar datos por intent.setData (myUri) mientras envío sendBroadcas (intent) y braoadcastReceiver no funciona en ese caso, ¿verdad?
Deadfish
Estoy un poco confundido sobre el ciclo de vida del servicio cuando tiene BroadcastReceiver (en mi caso, descargue BroadcastReceiver)
Android Man
1
@waqaslam ¿Estableció este BroadcastReceiver en su manifiesto?
IgorGanapolsky
2
@IgorGanapolsky No, no es necesario registrar dichos receptores en el manifiesto.
waqaslam
2
@SayyedRizwan Su servicio y BroadcastReceiver se ejecutarán bajo el mismo proceso y probablemente el mismo hilo (a menos que cree uno nuevo). El consumo de la batería depende de cómo se haya definido su hilo (fondo / primer plano) y la cantidad de emisiones que entra.
waqaslam
24

El mejor patrón es crear un modelo independiente BroadcastReceiver. Esto asegura que su aplicación pueda responder a la transmisión, ya sea que se Serviceesté ejecutando o no . De hecho, el uso de este patrón puede eliminar por Servicecompleto la necesidad de una ejecución constante .

Registre el BroadcastReceiveren su manifiesto y cree una clase / archivo separado para él.

P.ej:

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

Cuando el receptor se ejecuta, simplemente pasa un Intent( Bundle) al Servicey responde en onStartCommand().

P.ej:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // do your work quickly!
        // then call context.startService();
    }   
}
Paul Burke
fuente
6
Quiero que la transmisión esté dentro del ciclo de vida del servicio, de modo que la aplicación solo consulte mensajes / llamadas telefónicas de acuerdo con la línea de tiempo del servicio. ¿Este método permite eso? parece que lo ha configurado para que la recepción de la transmisión active el servicio.
Utopia025
Esta implementación iniciaría el Servicesi aún no se estaba ejecutando, o pasaría un nuevo Intentsi lo está (para su recuperación onStartCommand). Si sólo desea que se ejecute cuando el Servicees en vivo, usted podría programación activar / desactivar el Receivercomponente a través de los PackageManager's setComponentEnabledSetting().
Paul Burke
4
La respuesta de Waqas puede ser su mejor opción, si solo desea que esté Receivervivo cuando se Serviceestá ejecutando.
Paul Burke
3
Si no tiene una actividad, no funcionará para API 3.1 y superior: ashimita.blogspot.com.tr/2012/04/…
elif
1
A partir de Android 3.1, el sistema Android excluye a todos los receptores de recibir intents de forma predeterminada si el usuario nunca ha iniciado la aplicación correspondiente o si el usuario detuvo explícitamente la aplicación a través del menú de Android. vogella.com/tutorials/AndroidBroadcastReceiver/article.html
Juraj Petrik