2010-01-26 16 views
8

Ich habe einen Code-Schnipsel, die ich von einem Dienst bin Aufruf:registerReceiver für Broadcast nur, wenn es noch nicht registriert ist?

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

Was würde Ich mag ein Weg, um sicher zu überprüfen und sicherzustellen, dass die registerReceiver nicht schon hören, bevor er es wieder aufruft. Ist das möglich?

Zum Beispiel, wenn mein Codeschnipsel in einer Methode ist, und ich die Methode 10 Mal aufrufen, scheint jetzt die onReceive Methode 10 mal zu laufen.

Antwort

13

Es gibt keine Möglichkeit herauszufinden, — Sie sollten nur registerReceiver einmal aufrufen, am ehesten bei der Erstellung Ihres Dienstes.

Sie müssen einen Verweis auf die BroadcastReceiver auch für halten, wenn Sie unregisterService nennen (onDestroy() ist der natürliche Ort für sie), da sonst das System Sie über undichten Funkempfang warnen und wütend und möglicherweise an Sie schreien.

+0

Sieht so aus, als hättest du recht, ich musste einen Thread in meinem Dienst verwenden, damit er nicht immer wieder abfeuert. – pcm2a

0

Was ist so etwas wie dieses

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

dann

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

rufen jetzt t.register so viele, wie Sie möchten!

Verwandte Themen