web-dev-qa-db-fra.com

Récepteur de diffusion dans un service

J'essaie de démarrer un BroadcastReceiver dans un Service. Ce que j'essaie de faire est d'avoir un arrière-plan en cours d'exécution service qui collecte les messages texte entrants et enregistre les appels téléphoniques entrants. Je pensais que la meilleure façon de faire est d’avoir un service en cours d’exécution qui intègre un récepteur de radiodiffusion pouvant cataloguer l’un ou l’autre.

Comment puis-je faire cela? Mon service est déjà opérationnel.

85
Utopia025

votre service étant déjà configuré, ajoutez simplement un récepteur de diffusion à votre service:

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

dans votre service onCreate faites ceci:

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

et dans votre service onDestroy:

unregisterReceiver(receiver);

et vous êtes prêt à recevoir des émissions pour tous les filtres que vous mentionnez dans onCreate. Assurez-vous d'ajouter une autorisation si nécessaire. par exemple.

<uses-permission Android:name="Android.permission.RECEIVE_SMS" />
119
waqaslam

Le meilleur modèle consiste à créer un fichier autonome BroadcastReceiver. Cela garantit que votre application peut répondre à la diffusion, que Service soit en cours d'exécution ou non. En fait, l’utilisation de ce modèle peut supprimer la nécessité d’un Service à exécution constante.

Enregistrez le BroadcastReceiver dans votre manifeste et créez un fichier/classe distinct pour celui-ci.

Par exemple:

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

Lorsque le destinataire est en marche, il vous suffit de passer un Intent (Bundle) au Service, et d'y répondre dans onStartCommand().

Par exemple:

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