92 votes

Récepteur de diffusion au sein d'un service

Je suis en train de démarrer un BroadcastReceiver dans un Service. Ce que j'essaie de faire, c'est d'avoir un service en arrière-plan qui collecte les messages texte entrants et enregistre les appels entrants. J'ai pensé que la meilleure façon de procéder était d'avoir un service en cours d'exécution qui intègre un récepteur de diffusion qui peut cataloguer l'un ou l'autre.

Comment puis-je faire cela? J'ai déjà mon service en cours d'exécution.

131voto

waqaslam Points 31012

Comme votre service est déjà configuré, il vous suffit d'ajouter un récepteur de diffusion dans 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 le onCreate de votre service, faites ceci :

IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.addAction(android.telephony.TelephonyManager.ACTION_PHONE_STATE_CHANGED);
filter.addAction("vos_chaines_d_action"); //en savoir plus
filter.addAction("vos_chaines_d_action"); //en savoir plus

registerReceiver(receiver, filter);

et dans le onDestroy de votre service :

unregisterReceiver(receiver);

et vous êtes prêt à recevoir des diffusions pour tout filtre que vous mentionnez dans onCreate. Assurez-vous d'ajouter les autorisations nécessaires, par exemple :

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

1 votes

J'ai remarqué que je ne peux pas transmettre de données en utilisant intent.setData(myUri) tout en envoyant sendBroadcast(intent) et le BroadcastReceiver ne fonctionne pas dans ce cas, est-ce correct?

0 votes

Je suis un peu confus au sujet du cycle de vie du service lorsqu'il y a un BroadcastReceiver (dans mon cas, le BroadcastReceiver de téléchargement)

1 votes

@waqaslam Avez-vous défini ce BroadcastReceiver dans votre Manifeste?

27voto

Paul Burke Points 9869

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

Enregistrez le BroadcastReceiver dans votre Manifeste, et créez une classe/fichier séparé pour cela.

Par exemple:

Lorsque le récepteur s'exécute, vous transmettez simplement un Intent (Bundle) au Service, et y répondez dans onStartCommand().

Par exemple:

public class FooReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // faites votre travail rapidement!
        // puis appelez context.startService();
    }   
}

7 votes

Je veux que la diffusion soit incluse dans le cycle de vie du service, de sorte que l'application ne fasse des requêtes de messages/appels téléphoniques qu'en fonction de la chronologie du service. Est-ce que cette méthode le permet? On dirait que vous l'avez configurée pour que la réception de la diffusion déclenche le service.

0 votes

Cette implémentation démarrerait le Service s'il n'était pas déjà en cours d'exécution, ou passerait un nouvel Intent s'il l'est (pour la récupération dans onStartCommand). Si vous voulez seulement qu'il s'exécute lorsque le Service est actif, vous pourriez activer/désactiver de manière programmée le composant Receiver à travers la méthode setComponentEnabledSetting() du PackageManager.

4 votes

La réponse de Waqas peut être votre meilleure option, si vous voulez seulement que le Récepteur soit actif lorsque le Service est en cours d'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X