2010-01-26 44 views
8

Bir hizmetten aradığım bir kod parçacığım var:Sadece kayıtlı değilse, Kayıt için registerReceiver?

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

İstediğim şey, registerReceiver'nin yeniden aramadan önce dinlemediğinden emin olmak için bir yöntemdir. Mümkün mü?

Örneğin, kod parçacığım bir yöntemdeyse ve yöntemi 10 kez çağırırsam, şu anda onReceive yönteminin 10 kez çalıştığı görülüyor.

cevap

13

— öğesinin bulunmasının bir yolu yoktur, hizmet sağlamanızın bir sonucu olarak, yalnızca registerReceiver numaralı telefonu arayın.

aksi takdirde sistem sızıntı yayın alıcılarının konusunda uyarmak ve sinirlenmek ve muhtemelen size bağıracak de sen (onDestroy() bunun için doğal yerdir) unregisterService aradığınızda için BroadcastReceiver bir başvuru tutmak gerekir. Bu

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

gibi

+0

Haklısınız gibi gözüküyor, hizmetimdeki bir iş parçacığı üzerinden sürekli ateş etmemesi gerekiyor. – pcm2a

0

ne bir şey hakkında daha sonra

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

şimdi istediğiniz kadar t.register diyoruz!

İlgili konular