Wifi连接 – 断开监听器

我的class级必须实现哪一个监听器来自动检查代码是否连接/断开?

我能够手动检查无线连接/断开,但每次我需要从Android设置连接/断开WIFI,然后运行我的程序的结果。

请帮忙。 提前感谢。

我现在的代码很简单:

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

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

这就是我正在监听广播接收器中实际的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"); } }; 

为了访问活动的networking信息,您需要将以下使用权限添加到您的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> 

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


编辑2:另一个考虑是我的答案不检查你有一个连接到互联网 。 您可能连接到Wi-Finetworking,需要您login。以下是一个有用的“IsOnline()”检查: https ://stackoverflow.com/a/27312494/1140744

创build自己的扩展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_ACTION和CONNECTIVITY_ACTION 。

查看javadoc的这两页: ConnectivityManager WiFiManager

请注意,每个人都定义了广播操作。 如果您需要了解有关注册广播接收机的更多信息,请查看:以编程方式注册广播接收机

 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> 

编辑:

我应该补充说,如果您只需要在应用程序运行时接收广播,那么在代码中注册此广播接收器会比在清单中注册更好。 通过在清单中指定它,即使以前没有运行,也会通知进程连接更改。

AndroidManifest.xml中添加以下权限。

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

创build新的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> 

回应萨巴萨。 为了连接到连接变化广播接收机,我使用了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); } } } 

最后,在你的活动中,你可以添加一个监听器来利用这个callback。

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

注意,在callback触发后,侦听器被删除,这是因为它是一个静态侦听器。 无论如何,这个实现对我而言是一种钩住你的活动的方式,或者任何地方都是静态的。