9


इम CONNECTIVITY_ACTION से BroadcastMessages प्राप्त करने की कोशिश कर में अशक्त रिटर्न:BroadcastReceiver हमेशा intent.getExtras()

// register BroadcastReceiver on network state changes 
    final IntentFilter mIFNetwork = new IntentFilter(); 
    mIFNetwork.addAction(android.net.ConnectivityManager.CONNECTIVITY_ACTION); //"android.net.conn.CONNECTIVITY_CHANGE" 
    registerReceiver(mIRNetwork, mIFNetwork); 

और रिसीवर है:

private BroadcastReceiver mIRNetwork = new BroadcastReceiver() { 
    @Override 
    public void onReceive(final Context context, final Intent intent) { 

     android.util.Log.i(TAG,"mIRNetwork: Network State Received: "+intent.getAction()); 
     Bundle extras = intent.getExtras(); 
     if (extras!=null){ 
       android.util.Log.i(TAG,"mIRNetwork: ACTION_BACKGROUND_DATA_SETTING_CHANGED: "+extras.getString(ConnectivityManager.ACTION_BACKGROUND_DATA_SETTING_CHANGED)); 
       android.util.Log.i(TAG,"mIRNetwork: CONNECTIVITY_ACTION: "+extras.getString(ConnectivityManager.CONNECTIVITY_ACTION)); 
       android.util.Log.i(TAG,"mIRNetwork: EXTRA_EXTRA_INFO: "+extras.getString(ConnectivityManager.EXTRA_EXTRA_INFO)); 
       android.util.Log.i(TAG,"mIRNetwork: EXTRA_NO_CONNECTIVITY: "+extras.getString(ConnectivityManager.EXTRA_NO_CONNECTIVITY)); 
       android.util.Log.i(TAG,"mIRNetwork: EXTRA_REASON: "+extras.getString(ConnectivityManager.EXTRA_REASON)); 

      } 
     } 

कम एक्स्ट्रा कलाकार में हमेशा से रिक्त है। मैंने सोचा कि अगर मैं वाईफाई कनेक्शन खो देता हूं तो मुझे EXTRA_NO_CONNECTIVITY (cuz इसका इंटरनेट का एकमात्र तरीका) या कम से कम सूची से कुछ प्राप्त करना चाहिए। लेकिन कोई भाग्य नहीं है। अगर मैं अपने वाईफाई एपी रिसीवर को डिस्कनेक्ट करता हूं तो उसका संदेश मिलता है लेकिन शून्य एक्स्ट्रा के साथ। जब मैं एक बार फिर रिसीवर आग पर अपनी वाईफाई वापस चालू करता हूं लेकिन कोई अतिरिक्त नहीं ... वह क्यों है? कैसे पता चले कि ऐप ने कोई नेटवर्क कनेक्शन खो दिया है? मैंने इसका रास्ता सोचा।

उत्तर

13

आप अतिरिक्त नहीं मिल, लेकिन आप इस तरह से

private class ConnectivityBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager 
       .EXTRA_NO_CONNECTIVITY, false); 
     NetworkInfo info1 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager 
       .EXTRA_NETWORK_INFO); 
     NetworkInfo info2 = (NetworkInfo) intent.getParcelableExtra(ConnectivityManager 
       .EXTRA_OTHER_NETWORK_INFO); 
     String reason = intent.getStringExtra(ConnectivityManager.EXTRA_REASON); 
     boolean failOver = intent.getBooleanExtra(ConnectivityManager.EXTRA_IS_FAILOVER, false); 
     Log.d("MY_TAG", "onReceive(): mNetworkInfo=" + info1 + " mOtherNetworkInfo = " + 
       (info2 == null ? "[none]" : info2 + " noConn=" + noConnectivity)); 
    } 
} 

अधिक जानकारी के लिए से डेटा प्राप्त कर सकते हैं देखते हैं कि यह

http://code.google.com/p/androidwisprclient/source/browse/trunk/src/com/joan/pruebas/NetworkConnectivityListener.java?r=2

+0

'if (! Action.equals (ConnectivityManager.CONNECTIVITY_ACTION)) है' कर सकते हैं ' यह समझ में नहीं आता है जब फिल्टर में जोड़ा गया एकमात्र क्रिया CONNECTIVITY_ACTION है? –

+0

@ मुहम्मदबाबर यदि आप कनेक्टिविटी के लिए केवल एक ही क्रिया पंजीकृत करते हैं तो आप कार्रवाई की जांच करने के लिए शर्त को अनदेखा कर सकते हैं। – Dharmendra

+0

यह जांचने के लिए कि क्या हमारे पास इंटरनेट कनेक्शन है, क्या यह केवल "! Intent.getBooleanExtra (ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)" का उपयोग करना सुरक्षित है? –

4

Dharmendras answer अच्छा है सकते हैं। हालांकि, ध्यान दें कि अब EXTRA_NETWORK_INFO अब मान्य नहीं है (क्योंकि एपीआई स्तर 14) और एंड्रॉयड डॉक्स का कहना है कि निम्नलिखित:

के बाद से NetworkInfo यूआईडी के आधार पर भिन्न हो सकते हैं, आवेदन हमेशा getActiveNetworkInfo() के माध्यम से नेटवर्क की जानकारी प्राप्त करना चाहिए।

वास्तव में चीजें हमारे लिए बहुत आसान बनाती हैं। आप पुन: उपयोग कर सकता है कनेक्टिविटी इस तरह की जाँच आप शायद पहले किया था और ऐसा कुछ:

private class ConnectivityBroadcastReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     unregisterReceiver(this) 
     checkConnection(); 
    } 
} 

private void checkConnection() { 
    ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE); 
    if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo() 
      .isConnectedOrConnecting()) { 
     // do something 
    } 
} 

मान लिया जाये कि आप गतिविधि है कि निश्चित रूप से प्रसारण पंजीकृत अंदर कर रहे हैं।

यह भी रूप में संक्षेप संभव के रूप में केवल कनेक्टिविटी प्रसारण के लिए सुनने के लिए सर्वोत्तम प्रक्रियाओं का पालन के अतिरिक्त लाभ, outlined here :)

+0

यह काम नहीं कर रहा है, हमेशा दो बार बुलाया जाता है – huluyige

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