Pregunta Receptor de difusión dentro de un servicio


Estoy tratando de comenzar un BroadcastReceiver Dentro de un Service. Lo que intento hacer es tener un fondo funcionando service va que recoge los mensajes de texto entrantes y registra las llamadas telefónicas entrantes. Pensé que la mejor manera de hacerlo es tener un service funcionamiento que incorpora un receptor de difusión que puede catalogar cualquiera.

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


76
2018-02-01 07:10


origen


Respuestas:


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

unregisterReceiver(receiver);

y eres bueno para recibir transmisiones por los filtros que menciones en onCreate. Asegúrese de agregar cualquier permiso si es necesario. por ej.

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

110
2018-02-01 07:23



El mejor patrón es crear una versión independiente BroadcastReceiver. Esto asegura que su aplicación puede responder a la transmisión, ya sea que Service Esta corriendo. De hecho, el uso de este patrón puede eliminar la necesidad de un funcionamiento constante Service en total.

Registra el BroadcastReceiver en 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 responder a eso 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();
    }   
}

23
2018-02-01 07:29