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触发后,侦听器被删除,这是因为它是一个静态侦听器。 无论如何,这个实现对我而言是一种钩住你的活动的方式,或者任何地方都是静态的。
- 如何识别在ActionMode中是否单击完成button
- 为什么我们不能用一个半透明的系统吧和ActionBar
- onActivityResult RESULT_OK无法parsing为Android中的variables?
- 如何启动仅限服务的Android应用程序
- List和ArrayList有什么区别?
- Android SDK 22 – SearchView呈现问题
- Android M权限:onRequestPermissionsResult()没有被调用
- 如何在Android上以“提供反馈”模式启动Google Play意图?
- 应用程序错误 – 到服务器的连接不成功。 (文件:///android_asset/www/index.html)