Wifi连接断开侦听器

| 我的班必须实现哪个侦听器才能自动检查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\");
}
    
已邀请:
        实际上,您是在检查是否启用了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:
<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中,如果您要在用户连接到未计量的网络连接时执行某项操作,则Job Scheduling可能会有所帮助。看看:http://developer.android.com/about/versions/android-5.0.html#Power 编辑2:另一个考虑是我的答案不会检查您是否已连接到Internet。您可以连接到需要登录的Wi-Fi网络。这是一个有用的“ IsOnline()\”检查:https://stackoverflow.com/a/27312494/1140744     
        创建您自己的扩展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_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>
编辑: 我应该补充一点,如果只需要在应用程序运行时接收广播,则最好在代码中而不是在清单中注册此广播接收器。通过在清单中指定它,即使先前未运行连接更改,您的进程也将收到通知。   如果目标为Android 7.0(API级别24)及更高版本的应用在清单中声明了广播接收器,则不会接收该广播。如果应用将其android.content.BroadcastReceiver}注册到android.content.Context#registerReceiver Context.registerReceiver(),并且该上下文仍然有效,它们仍将接收广播。     
        在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>
    
        为了回应sabsab。为了适应“连接性更改”广播接收器,我使用了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
        }
    });
请注意,回调触发后,监听器将被删除,这是因为它是静态监听器。无论如何,此实现对我而言都是有效的,并且是挂接到您的活动的一种方法,或者可以使它处于静态。     
        我同意@ tanner-perrien的回答,Kotlin在2020年代表:
class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        registerReceiver(wifiBroadcastReceiver, IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION))
    }

    private val wifiBroadcastReceiver = object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            val wifiManager = getSystemService(Context.WIFI_SERVICE) as WifiManager
            Log.d(\"TUT\", \"Wifi is ${wifiManager.isWifiEnabled}\")
        }
    }

    override fun onDestroy() {
        unregisterReceiver(wifiBroadcastReceiver)
        super.onDestroy()
    }
}
但可能想与时俱进:https://developer.android.com/reference/android/net/ConnectivityManager.NetworkCallback
<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>
活动:
lateinit var connec: ConnectivityManager

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    connec = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

    val networkRequestWiFi = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        .build()

    connec.registerNetworkCallback(networkRequestWiFi, networkCallbackWiFi)
 }

private var networkCallbackWiFi = object : ConnectivityManager.NetworkCallback() {
    override fun onLost(network: Network?) {
        Log.d(\"TUT\", \"WiFi disconnected\")
    }

    override fun onAvailable(network: Network?) {
        Log.d(\"TUT\", \"WiFi connected\")
    }
}

override fun onDestroy() {
    connec.unregisterNetworkCallback(networkCallbackWiFi)
    super.onDestroy()
}
    

要回复问题请先登录注册