2011-06-15 212 views
43

我的班级必须实现哪个监听器才能自动检查代码是否连接/断开连接?Wifi连接 - 断开监听器

我可以手动检查WiFi连接/断开连接,但每次需要连接/断开WIFI从android设置,然后运行我的程序的结果。

我当前的代码很简单,只要:

WifiManager wifi = (WifiManager)getSystemService(Context.WIFI_SERVICE); 
if (wifi.isWifiEnabled()==true) 
{ 
    tv.setText("You are connected"); 
} 
else 
{ 
    tv.setText("You are NOT connected"); 
} 

回答

13

退房的javadoc的这两个页面: ConnectivityManager WiFiManager

注意,每一个定义广播动作。如果您需要了解更多有关注册的广播接收器,检查了这一点: Programmatically register a broadcast receiver

BroadcastReceiver receiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
    if (wifi.isWifiEnabled()) { 
     tv.setText("You are connected"); 
    } else { 
     tv.setText("You are NOT connected"); 
    } 
    } 
}; 

而在你的清单,你可以做这样的事情(如果你宁愿不登记在代码中的接收器):

<application android:icon="@drawable/icon" android:label="@string/app_name"> 
    <receiver android:name=".WiFiReceiver" android:enabled="true"> 
     <intent-filter> 
      <action android:name="android.net.ConnectivityManager.CONNECTIVITY_ACTION" /> 
     </intent-filter> 
    </receiver> 
</application> 

编辑:

我要补充,这将是更好地登记在你的代码这个广播接收器,而不是在清单中,如果您只需在应用程序运行时接收广播。通过在清单中指定它,即使它以前没有运行,您的进程也会收到连接更改的通知。

+0

谢谢Tanner!将尝试。 – Neha 2011-06-17 19:22:10

+1

我建议您编辑您的代码并明确参考上下文:“WifiManager wifi =(WifiManager)context.getSystemService(Context.WIFI_SERVICE);”否则,如果在单独的类中使用,则可能会出现“getSystemService()”错误。 – 2012-07-20 14:54:48

17

创建自己的类,它扩展了BroadcastReceiver ...

public class MyNetworkMonitor extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     // Process the Intent here 

    } 
} 

在AndroidManifest.xml

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

使用意向的解释请参见WIFI_STATE_CHANGED_ACTIONCONNECTIVITY_ACTION

+0

谢谢MisterSquonk。将尝试。 – Neha 2011-06-17 19:23:26

+0

那些来自WifiManager @Squonk的变量? – gumuruh 2014-07-21 10:32:54

+0

@gumuruh WIFI_STATE_CHANGED_ACTION属于WifiManager类,CONNECTIVITY_ACTION属于ConnectivityManager。你可能想要检查更多的连接类型,即如果移动网络可用,那么你应该问活动网络,在那里你可以得到NetworkInfo( - >类型)ConnectionManager.TYPE_MOBILE ... – 2014-12-19 12:58:04

67

其实你正在检查是否启用了,这并不意味着它是连接。这仅表示手机上的Wi-Fi模式已启用,并且能够连接到Wi-Fi网络。

这是我在听在我的广播接收器的实际Wi-Fi连接:

public class WifiReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) {  
     ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
      Log.d("WifiReceiver", "Have Wifi Connection"); 
     else 
      Log.d("WifiReceiver", "Don't have Wifi Connection");  
    } 
}; 

为了获得你需要以下用途的许可添加到您的AndroidManifest活动的网络信息。 XML:

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

而下面的意图接收器(或者你可以以编程方式添加此...)

<!-- Receive Wi-Fi connection state changes --> 
<receiver android:name=".WifiReceiver"> 
    <intent-filter> 
     <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter> 
</receiver> 

编辑:在棒棒糖中,如果您要在用户连接到未定义的网络连接时执行操作,作业计划可能会有所帮助。请看:http://developer.android.com/about/versions/android-5.0.html#Power


编辑2:另一个考虑是,我的回答不会检查是否有到互联网连接。您可以连接到Wi-Fi网络,需要您登录这里是一个有用的“IsOnline()”检查:https://stackoverflow.com/a/27312494/1140744

+0

这很棒,但我怎么能在我的活动中使用它? – sabsab 2015-01-26 23:27:22

+0

它被调用两次。我得到这两次,WifiReceiver:有无线连接 – 2017-08-13 12:43:19

+0

'android.net.conn.CONNECTIVITY_CHANGE'已弃用。现在什么是解决方案? – 2017-11-15 10:50:24

3

AndroidManifest.xml中添加以下权限。

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

创建新的Receiver类。

public class ConnectionChangeReceiver extends BroadcastReceiver { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     ConnectivityManager connectivityManager = 
      (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo activeNetInfo = connectivityManager.getActiveNetworkInfo(); 

     if (activeNetInfo != null 
      && activeNetInfo.getType() == ConnectivityManager.TYPE_WIFI) { 
      Toast.makeText(context, "Wifi Connected!", Toast.LENGTH_SHORT).show(); 
     } else { 
      Toast.makeText(context, "Wifi Not Connected!", Toast.LENGTH_SHORT).show(); 
     } 
    } 

,并添加接收器类的AndroidManifest.xml文件。

<receiver android:name="ConnectionChangeReceiver" 
      android:label="NetworkConnection"> 
    <intent-filter> 
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/> 
    </intent-filter> 
</receiver> 
1

作为对sabsab的回应。为了连接到Connectivity Change广播接收器,我使用了warbi的答案并添加了一个静态方法的类。

public class WifiHelper 
{ 
    private static boolean isConnectedToWifi; 
    private static WifiConnectionChange sListener; 

    public interface WifiConnectionChange { 
     void wifiConnected(boolean connected); 
    } 

    /** 
    * Only used by Connectivity_Change broadcast receiver 
    * @param connected 
    */ 
    public static void setWifiConnected(boolean connected) { 
     isConnectedToWifi = connected; 
     if (sListener!=null) 
     { 
      sListener.wifiConnected(connected); 
      sListener = null; 
     } 
    } 

    public static void setWifiListener(WifiConnectionChange listener) { 
     sListener = listener; 
    } 
} 

然后,我对上面显示的第一个答案的接收器类进行了更改。

public class ConnectivityReceiver extends BroadcastReceiver 
{ 
@Override 
public void onReceive(Context context, Intent intent) 
{ 
    ConnectivityManager conMan = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo netInfo = conMan.getActiveNetworkInfo(); 
    if (netInfo != null && netInfo.getType() == ConnectivityManager.TYPE_WIFI) 
    { 
     Log.d("WifiReceiver", "Have Wifi Connection"); 
     WifiHelper.setWifiConnected(true); 
    } else 
    { 
     Log.d("WifiReceiver", "Don't have Wifi Connection"); 
     WifiHelper.setWifiConnected(false); 
    } 

} 
} 

最后,在您的活动中,您可以添加一个侦听器来利用此回调。

wifiManager = (WifiManager) getContext().getSystemService(Context.WIFI_SERVICE); 
wasWifiEnabled = (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLED || wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING); 
WifiHelper.setWifiListener(new WifiHelper.WifiConnectionChange() 
    { 
     @Override 
     public void wifiConnected(boolean connected) 
     { 
      //Do logic here 
     } 
    }); 

注意,在回调触发后,侦听器被删除,这是因为它是一个静态侦听器。无论如何,这个实现对我来说是有效的,并且是钩住你的活动的一种方式,或者在任何地方使它成为静态的。