2010-01-26 15 views
8

मेरे पास कोड का एक स्निपेट है जिसे मैं एक सेवा से कॉल कर रहा हूं:ब्रॉडकास्ट के लिए रजिस्टर रिसीवर केवल तभी पंजीकृत है जब यह पहले से पंजीकृत नहीं है?

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

मुझे यह देखने का एक तरीका है कि यह जांचने और सुनिश्चित करने के लिए कि registerReceiver इसे पहले से कॉल करने से पहले पहले से नहीं सुन रहा है। क्या यह संभव है?

उदाहरण के लिए यदि कोड का मेरा स्निपेट एक विधि में है, और मैं विधि 10 बार कॉल करता हूं, तो अभी onReceive विधि 10 बार चलती है।

उत्तर

13

— को खोजने का कोई तरीका नहीं है, आपको केवल अपनी सेवा के निर्माण पर registerReceiver पर कॉल करना चाहिए।

आप भी जब आप unregisterService फोन (onDestroy() इसके लिए प्राकृतिक स्थान पर है) के लिए BroadcastReceiver के लिए एक संदर्भ रखने की जरूरत है अन्यथा प्रणाली लीक प्रसारण रिसीवर के बारे में चेतावनी और गुस्सा हो और संभवतः आप पर चिल्लाते होगा।

+0

ऐसा लगता है कि आप सही हैं, मुझे इसे बंद करने से रोकने के लिए मेरी सेवा में एक थ्रेड का उपयोग करने की आवश्यकता है। – pcm2a

0

क्या कुछ के बारे में इस

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

की तरह तो

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

अब t.register के रूप में कई के रूप में आप की तरह कहते हैं!

संबंधित मुद्दे