2010-01-26 13 views
8

que tienen un fragmento de código que estoy llamando desde un servicio:registerReceiver for Broadcast only si aún no está registrado?

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

Lo que me gustaría es una manera de comprobar y asegurarse de que el registerReceiver ya no está escuchando antes de que llame de nuevo. es posible?

Por ejemplo, si mi fragmento de código está en un método, y llamo al método 10 veces, ahora el método onReceive parece ejecutarse 10 veces.

Respuesta

13

No hay forma de averiguar —, solo debe llamar al registerReceiver una vez, lo más probable en la creación de su servicio.

que necesita para mantener una referencia a la BroadcastReceiver demasiado para cuando llame unregisterService (onDestroy() es el lugar natural para ello), de lo contrario el sistema le advertirá sobre los receptores de radiodifusión con fugas y obtener enojado y posiblemente gritarte.

+0

Parece que tiene usted razón, tenía que usar un hilo en mi servicio para evitar que se disparando una y otra vez. – pcm2a

0

¿Qué pasa algo como esto

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

continuación

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

ahora llaman t.register tanto como te gusta!

Cuestiones relacionadas