2010-01-26 18 views
8

Ho un frammento di codice che sto chiamando da un servizio:registerReceiver for Broadcast solo se non è già registrato?

context.registerReceiver(new BroadcastReceiver() { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     try { 
      WifiManager mWm = (WifiManager) context 
        .getSystemService(Context.WIFI_SERVICE); 
      ret = mWm.isWifiEnabled(); 
      // DO MORE STUFF HERE 
     } catch (Exception e) { 
     } 
    } 
}, new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)); 

Quello che vorrei è un modo per controllare e fare in modo che il registerReceiver non già in attesa prima di chiamare di nuovo. È possibile?

Ad esempio se il mio snippet di codice è in un metodo e chiamo il metodo 10 volte, in questo momento il metodo onReceive sembra essere eseguito 10 volte.

risposta

13

Non c'è un modo per scoprire — si dovrebbe chiamare solo registerReceiver una volta, molto probabilmente alla creazione del proprio servizio.

è necessario mantenere un riferimento al BroadcastReceiver anche per quando si chiama unregisterService (onDestroy() è il luogo naturale per farlo), altrimenti il ​​sistema vi avvertirà che perde riceventi per la radiodiffusione e arrabbiarsi e forse gridare a voi.

+0

Sembra che tu abbia ragione, avevo bisogno di usare una discussione nel mio servizio per impedirgli di sparare più e più volte. – pcm2a

0

Che dire qualcosa di simile

class Thing { 
    interface R { 
     void onReceive(Context c, Intent i); 
    } 

    private BroadcastReceiver receiver; 
    private IntentFilter filter; 
    private boolean isRegistered = false; 

    public Thing(Thing.R r, String... actions) { 
     receiver = new BroadcastReceiver() { 
      @Override 
      public void onReceive(Context context, Intent intent) { 
       r.onReceive(context, intent); 
      } 
     }; 
     filter = new IntentFilter(); 
     for (String a : actions) 
      filter.addAction(a); 
    } 

    public void register(Context c) { 
     if (isRegistered) return; 
     c.registerReceiver(receiver, filter); 
     isRegistered = true; 
    } 

    public void unregister(Context c) { 
     if (!isRegistered) return; 
     c.unregisterReceiver(receiver); 
     isRegistered = false; 
    } 
} 

poi

Thing t = new Thing((c, i) -> { 
    try { 
     WifiManager mWm = (WifiManager) context 
       .getSystemService(Context.WIFI_SERVICE); 
     ret = mWm.isWifiEnabled(); 
     // DO MORE STUFF HERE 
    } catch (Exception e) { 
    } 
}, WifiManager.WIFI_STATE_CHANGED_ACTION); 

oggi chiamiamo t.register come molti come ti piace!

Problemi correlati