2013-04-11 15 views
11

मेरे ऐप में इंटरनेट कनेक्शन की जांच करने का प्रयास कर रहा है। मेरे प्रकट की एक कोड है:ब्रॉडकास्ट रिसीवर दो बार

<uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
     <receiver android:name=".MyReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
     </intent-filter> 
    </receiver> 

और वहाँ एक हैंडल वर्ग है:

public class MyReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(intent.getAction() != null && intent.getAction().equals("android.net.conn.CONNECTIVITY_CHANGE")); 
    { 
     Log.d("myLogs", "Network connectivity change"); 
     if (intent.getExtras() != null) { 
      NetworkInfo ni = (NetworkInfo) intent.getExtras().get(
        ConnectivityManager.EXTRA_NETWORK_INFO); 
      if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED) { 
       Log.i("myLogs", "Network " + ni.getTypeName() + " connected"); 
      } 
     } 
     if (intent.getExtras().getBoolean(
       ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE)) { 
      Log.d("myLogs", "There's no network connectivity"); 
     } 
    } 
} 

}

मेरी Logcat में मैं एक तरह एक तस्वीर मिल:

04-11 23:24:48.021: D/myLogs(10261): Network connectivity change 
04-11 23:24:48.021: I/myLogs(10261): Network WIFI connected 
04-11 23:24:48.202: D/myLogs(10261): Network connectivity change 
04-11 23:24:48.202: I/myLogs(10261): Network WIFI connected 

तो, रिसीवर दो बार बुलाया जाता है। क्यूं कर? सभी प्रकार के कनेक्शन के साथ कुछ समस्या है।

+0

शायद कनेक्ट होने के विभिन्न स्तर हैं, और आपके 2 लॉग 2 अलग-अलग उप-राज्य हैं। मैं यह देखने के लिए और अधिक जानकारी दूंगा कि वे कैसे भिन्न होते हैं। –

+0

लॉग इन करने का प्रयास करें 'अगर (netinfo! = अशक्त && netInfo.isConnected()) { \t \t \t \t \t Log.i (" myLogs "," नेटवर्क "+ netinfo।GetTypeName() + "कनेक्ट"); \t \t \t} ' Have विचार दो उप राज्य देखते हैं कि - isConnecting और isConnected, लेकिन एक ही समस्या/ – Sunstrike

उत्तर

3

मान लें कि वाईफ़ाई कनेक्ट होने पर आपको कनेक्ट किया गया संदेश मिलता है, मुझे लगता है कि पहला वाला सही है और दूसरा 2 किसी कारण से सिर्फ इकोज़ है।

यह जानने के लिए कि संदेश कहलाता है, आप एक स्थिर बुलियन प्राप्त कर सकते हैं जो कनेक्ट और डिस्कनेक्ट के बीच टॉगल हो जाता है और जब आप कनेक्शन प्राप्त करते हैं तो केवल अपने उप-दिनचर्या को कॉल करते हैं और बुलियन सत्य होता है। कुछ की तरह:

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    private static boolean firstConnect = true; 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     final ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     final NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 
     if (activeNetInfo != null) { 
      if(firstConnect) { 
       // do subroutines here 
       firstConnect = false; 
      } 
     } 
     else { 
      firstConnect= true; 
     } 
    } 
} 

नोट

दो चीजें आप के लिए देखने की जरूरत है। फर्स्ट स्टोर "फर्स्ट कनेक्ट" कहीं, उदाहरण के लिए साझा प्राथमिकताओं में, और दूसरी बात यह है कि जब आप 3 जी से वाईफाई में बदलते हैं, तो कोई वास्तविक डिस्कनेक्ट नहीं होता है, इसलिए 3 जी और वाईफाई घटनाओं को अलग से संभालना बेहतर होता है

+1

मेरे लिए काम नहीं किया था और इस जवाब की एक प्रति है http://stackoverflow.com/questions/8412714/broadcastreceiver-प्राप्त करता है-बहु-समान-संदेशों के लिए एक घटना/8413512 # 8413512 – DJphy

1

आपको भी आवश्यकता हो सकती है यह देखने के लिए जांचें कि क्या इरादा प्राप्त किया जा रहा है, यह आपके रिसीवर में स्टिकीबॉडकास्ट की जांच करके चिपचिपा घटनाओं में से एक है। यदि यह सत्य है, तो आप इसे अनदेखा कर सकते हैं, और जारी रख सकते हैं। जैसे ही रिसीवर पंजीकृत होता है, आपको चिपचिपा प्रसारण मिलते हैं। एक डिवाइस की कनेक्टिविटी को

"परिवर्तन बहुत अक्सर -इस प्रसारण हर बार जब आप मोबाइल डेटा और वाई-फाई के बीच ले जाने शुरू हो रहा है हो सकता है परिणामस्वरूप:

http://developer.android.com/reference/android/content/BroadcastReceiver.html#isInitialStickyBroadcast%28%29

0

डॉक्स में समझाया। , केवल इस प्रसारण की निगरानी करने के लिए यह अच्छा अभ्यास है जब आपने को फिर से शुरू करने के लिए पहले अपडेट या डाउनलोड निलंबित कर दिए हैं। आमतौर पर अपडेट शुरू करने से पहले इंटरनेट कनेक्टिविटी की जांच करना पर्याप्त होता है, और कोई भी नहीं होना चाहिए, तब तक और अपडेट निलंबित करें कनेक्टिविटी बहाल कर दी गई है। "

संपादित करें: जोड़ने के लिए भूल गए ... एक प्रसारण रिसीवर केवल यह जानने के लिए कि डिवाइस कनेक्ट है या नहीं, एक होवरहेड है। उसी दस्तावेज़ से:

ConnectivityManager cm = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo activeNetwork = cm.getActiveNetworkInfo(); 
boolean isConnected = activeNetwork != null && activeNetwork.isConnectedOrConnecting(); 
boolean isWiFi = activeNetwork.getType() == ConnectivityManager.TYPE_WIFI; 
संबंधित मुद्दे