2010-02-19 46 views
38

我需要接受网络操作,如连接,断开等我使用用于此目的的广播接收器的网络广播。谁能告诉我,我需要它的意图行动,以捕获网络事件,现在按我搜索互联网上我使用android.net.ConnectivityManager.CONNECTIVITY_ACTION意向行动

这里是我的广播接收器类:

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 

public class NetworkStateReceiver extends BroadcastReceiver { 

@Override 
public void onReceive(Context context, Intent intent) { 
    // TODO Auto-generated method stub 


    if (intent.getAction().equals(
      android.net.ConnectivityManager.CONNECTIVITY_ACTION)) { 

     // do something.. 
    } 
} 
} 

,我还增加了允许访问网络状态:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

这里是如何我已经宣布这个类清单文件

<receiver class=".NetworkStateReceiver" android:name=".NetworkStateReceiver"> 
    <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
    </intent-filter> 
</receiver> 

请建议我在正确的意图行动,如果我错了,或有任何其他方式捕捉网络事件。

回答

51

这里有一个工作示例:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

<receiver android:name=".receiver.ConnectivityReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
    } 

} 
+0

根据我的测试,我不需要任何许可接收广播,无论wlan现在是上/下还是3g现在上/下。我有点困惑,什么是android.net.conn.CONNECTIVITY_CHANGE然后好? – 2011-05-11 18:08:59

+0

如果你再看看,你会发现CONNECTIVITY_CHANGE是不是权限,它的注册意向接收器(您可以在代码或者做)。 – Hamid 2012-04-12 12:25:53

+0

答案看起来与问题相同。那么为什么它在答案之前不工作? – 2012-07-20 21:19:54

5

yanchenko的答案是非常有用的,我只是简化了一点点获得连接状态,请如下修改的onReceive:

public class ConnectivityReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     Log.d(ConnectivityReceiver.class.getSimpleName(), "action: " 
       + intent.getAction()); 
     MyConstants.IS_NETWORK_AVAILABLE = haveNetworkConnection(context); 
     //IS_NETWORK_AVAILABLE this variable in your activities to check networkavailability. 

    } 


    private boolean haveNetworkConnection(Context context) { 
     boolean haveConnectedWifi = false; 
     boolean haveConnectedMobile = false; 

     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo[] netInfo = cm.getAllNetworkInfo(); 
     for (NetworkInfo ni : netInfo) { 
      if (ni.getTypeName().equalsIgnoreCase("WIFI")) 
       if (ni.isConnected()) 
        haveConnectedWifi = true; 
      if (ni.getTypeName().equalsIgnoreCase("MOBILE")) 
       if (ni.isConnected()) 
        haveConnectedMobile = true; 
     } 
     return haveConnectedWifi || haveConnectedMobile;  
    } 
} 
+0

,你知道android.net.ConnectivityManager.EXTRA_NO_CONNECTIVITY?自API级别1以来,这是额外的Intent中的一个额外布尔值,它告诉您是否存在连接。 – 2012-12-15 17:01:23

+1

关于昨天的评论,我注意到它并不精确。看起来EXTRA_NO_CONNECTIVITY,至少在某些情况下,只有在没有连接时才会添加到Intent extras中。因此,与getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY,FALSE)访问它应该产生一个布尔值,如果没有连接可言,和假,如果有任何连接这是真的。此外,这个答案中的代码是**反模式**,因为分析是有限的。它不会检测蓝牙共享,USB共享或LAN连接。不要这样做。 – 2012-12-17 09:40:38

+2

归因于该代码,看到拉维忘了:http://stackoverflow.com/a/4239410/182653 – paulw1128 2013-05-22 17:48:26