首页 文章

Wifi Connect-Disconnect Listener

提问于
浏览
49

我的 class 必须实施哪个监听器,以便在wifi连接/断开连接时自动检查代码?

我能够手动检查wifi连接/断开,但每次我需要连接/断开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");
}

5 回答

  • 72

    实际上,您正在检查Wi-Fi是否已启用,但未连接 . 这只意味着手机上的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>
    

    编辑:在Lollipop中,如果您希望在用户连接到未计量的网络连接时执行操作,则作业调度可能会有所帮助 . 看看:http://developer.android.com/about/versions/android-5.0.html#Power


    编辑2:另一个考虑因素是我的答案没有检查你是否有连接到互联网 . 您可以连接到需要登录的Wi-Fi网络 . 这是一个有用的"IsOnline()"检查:https://stackoverflow.com/a/27312494/1140744

  • 14

    创建自己的类,扩展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>
    

    有关使用Intent的说明,请参阅WIFI_STATE_CHANGED_ACTIONCONNECTIVITY_ACTION .

  • 1

    看看这两页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>
    

    EDIT:

    我应该补充一点,如果您只需要在应用程序运行时接收广播,最好在代码中注册此广播接收器而不是在清单中 . 通过在清单中指定它,即使以前没有运行连接,也会通知您的进程 .

  • 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>
    
  • 17

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

    请注意,在回调触发后会删除侦听器,这是因为它是一个静态侦听器 . 无论如何这个实现对我有用,并且是一种挂钩你的活动的方式,或者任何地方都给它静态 .

相关问题