2010-10-22 4 views
2

J'ai un service qui écoute le téléphone. Lorsque le téléphone passe au ralenti, je veux envoyer un message à mon activité. Il semble que j'ai deux options pour y parvenir. BroadcastReceiver et liaison au service. BroadcastReceiver ressemblait à un mécanisme plus facile, j'ai donc essayé le test suivant.Quel est le moyen le plus simple d'envoyer un message du service local à l'activité

Dans mon activité:

@Override 
protected void onStart() { 
    super.onStart(); 
    IntentFilter filter = new IntentFilter("MyAction"); 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      Log.d(TAG, "Yay......."); 
      abortBroadcast(); 
     } 
    }, filter); 
} 

Dans mon service qui est à l'écoute des événements, quand je perçois mon événement désiré:

Intent localIntent = new Intent(_context, MainActivity.class); 
    intent.setAction("MyAction"); 
    _context.sendOrderedBroadcast(localIntent, null); 

Dans mon test, la méthode OnReceive() est jamais appelé après avoir regardé l'émission envoyée avec le débogueur. Qu'est-ce que je rate? En outre, un BroadcastReceiver est-il le moyen le plus simple pour un service local de communiquer avec une activité?

+0

fait votre manifeste avoir le approprié ? – aprock

Répondre

4

Je pense avoir eu quelques problèmes dans mon test initial. 1. Lorsque j'ai créé mon intention dans mon service, l'argument "action" doit être pris en compte. 2. Je crois que j'avais besoin d'ajouter le filtre d'intention à mon manifeste.

Mon exemple de travail est maintenant:

Activité:

 startService(intent); 

     IntentFilter filter = new IntentFilter(PhoneListeningService.PHONE_IDLE); 
     registerReceiver(new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       Log.d(TAG, "Yay......."); 
      } 
     }, filter); 

Manifest:

<activity android:name=".MainActivity" android:screenOrientation="portrait" > 
     <intent-filter> 
      <action android:name="com.ncc.PhoneListeningService.action.PHONE_IDLE" /> 
     </intent-filter> 
    </activity> 

Service:

Déclare constant du public pour le nom de "action" et diffuser un intention.

public static final String PHONE_IDLE = "com.ncc.PhoneListeningService.action.PHONE_IDLE"; 

... mon téléphone auditeur détecte inactif:

  Intent intent = new Intent(PHONE_IDLE); 
      sendBroadcast(intent); 
+0

cela a-t-il fonctionné? Peut mettre l'ensemble de la solution tout à fait s'il vous plaît. –

+0

Merci pour l'exemple court et concis! @aaaaaaa: oui, ça marche. – johndodo

+0

... sauf que vous devez unregisterReceiver() lorsque l'activité s'arrête ... mais c'est une correction mineure. – johndodo

Questions connexes