当前位置: 首页 > 知识库问答 >
问题:

Android:互联网连接变化监听器

符鸣
2023-03-14

我已经有了监听连接变化的代码-

public class NetworkStateReceiver extends BroadcastReceiver
{
  public void onReceive(Context context, Intent intent)
  {
    Log.d("app","Network connectivity change");

    if(intent.getExtras() != null)
    {
      NetworkInfo ni = (NetworkInfo) intent.getExtras().get(ConnectivityManager.EXTRA_NETWORK_INFO);
      if(ni != null && ni.getState() == NetworkInfo.State.CONNECTED)
      {
        Log.i("app", "Network " + ni.getTypeName() + " connected");
      }
    }

    if(intent.getExtras().getBoolean(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE))
    {
      Log.d("app", "There's no network connectivity");
    }
  }
}

我用这个代码检查互联网连接——互联网检查

但问题是,如果网络突然失去互联网连接,而没有任何连接变化,这个代码是无用的。是否有任何方法来创建广播接收器侦听器为互联网连接的变化?我有一个网络应用程序,突然的互联网连接变化会导致问题。

共有3个答案

卞嘉许
2023-03-14

更新:

针对Android 7.0(API级别24)及更高版本的应用程序如果在其清单中声明了广播接收器,则不会接收连接性行动广播。如果应用程序在上下文中注册其BroadcastReceiver,则仍将接收连接操作广播。registerReceiver()并且该上下文仍然有效。

您需要通过registerReceiver()方法注册接收器:

 IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
 mCtx.registerReceiver(new NetworkBroadcastReceiver(), intentFilter);
丁淇
2023-03-14

ConnectivityAction在api 28中不建议使用。相反,只要您支持api 24,您就可以使用recsterDefaultNetworkCallback

静态编程语言:

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager?.let {
    it.registerDefaultNetworkCallback(object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            //take action when network connection is gained
        }
        override fun onLost(network: Network?) {
            //take action when network connection is lost
        }
    })
}
杜良骏
2023-03-14

试试这个

public class NetworkUtil {
    public static final int TYPE_WIFI = 1;
    public static final int TYPE_MOBILE = 2;
    public static final int TYPE_NOT_CONNECTED = 0;
    public static final int NETWORK_STATUS_NOT_CONNECTED = 0;
    public static final int NETWORK_STATUS_WIFI = 1;
    public static final int NETWORK_STATUS_MOBILE = 2;

    public static int getConnectivityStatus(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        NetworkInfo activeNetwork = cm.getActiveNetworkInfo();
        if (null != activeNetwork) {
            if(activeNetwork.getType() == ConnectivityManager.TYPE_WIFI)
                return TYPE_WIFI;

            if(activeNetwork.getType() == ConnectivityManager.TYPE_MOBILE)
                return TYPE_MOBILE;
        } 
        return TYPE_NOT_CONNECTED;
    }

    public static int getConnectivityStatusString(Context context) {
        int conn = NetworkUtil.getConnectivityStatus(context);
        int status = 0;
        if (conn == NetworkUtil.TYPE_WIFI) {
            status = NETWORK_STATUS_WIFI;
        } else if (conn == NetworkUtil.TYPE_MOBILE) {
            status = NETWORK_STATUS_MOBILE;
        } else if (conn == NetworkUtil.TYPE_NOT_CONNECTED) {
            status = NETWORK_STATUS_NOT_CONNECTED;
        }
        return status;
    }
}

还有广播接收器

public class NetworkChangeReceiver extends BroadcastReceiver {

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

        int status = NetworkUtil.getConnectivityStatusString(context);
        Log.e("Sulod sa network reciever", "Sulod sa network reciever");
        if ("android.net.conn.CONNECTIVITY_CHANGE".equals(intent.getAction())) {
            if (status == NetworkUtil.NETWORK_STATUS_NOT_CONNECTED) {
                new ForceExitPause(context).execute();
            } else {
                new ResumeForceExitPause(context).execute();
            }
       }
    }
}

别忘了把这个放进你的AndroidManifest里。xml

 <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
 <uses-permission android:name="android.permission.INTERNET" />
 <receiver
        android:name="NetworkChangeReceiver"
        android:label="NetworkChangeReceiver" >
        <intent-filter>
            <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            <action android:name="android.net.wifi.WIFI_STATE_CHANGED" />
        </intent-filter>
    </receiver>

希望这能帮你干杯!

 类似资料:
  • 问题内容: 我已经有了这段侦听连接性更改的代码- 我使用此代码检查连接- 但是问题是,如果网络突然失去了互联网连接而没有任何连接更改,则此代码将无用。有什么方法可以创建广播接收器侦听器以更改Internet连接吗?我有一个Web应用程序,突然的Internet连接更改会引起问题。 问题答案: 尝试这个 对于广播接收器 不要忘记将其放入你的AndroidManifest.xml 希望这会为你加油!

  • 问题内容: 我正在开发一个Android应用程序,该应用程序将继续保持与Internet的连接。如果互联网是陶氏的,则应向用户提供适当的消息。 有没有像Internet Listener这样的东西?或如何实施此事件,以便每当没有Internet连接时都应发出警报。 问题答案: 为此创建一个广播接收器,并将其注册到清单文件中。 首先创建一个新类并扩展BroadcastReceiver。 将此代码放在

  • 本文向大家介绍Android 实时监测(监听)网络连接状态变化,包括了Android 实时监测(监听)网络连接状态变化的使用技巧和注意事项,需要的朋友参考一下 看了网上的很多,都不是自己想要的。所以自己就参考着写了一个。 实现这个的方法很多,我是想的这种,如果哪有不足,有bug的地方希望大家指出,共同进步。。。。 先简单说一下思路:网络变化时系统会发出广播。所以我们监听这个广播,利用接口回调通知a

  • 若要使用PS Vita与互联网连接,需先准备无线通信的环境。 若您的住家等地无法通过无线通信,可使用公众无线LAN服务(Hotspot)在公众场所与互联网连接。 公众无线LAN服务的使用方法与费用会因该服务的提供者而异。详细请询问该服务的提供者。 使用Wi-Fi连接 若要使用Wi-Fi与互联网连接,需准备以下内容。此外,接入点的设定通常会通过电脑进行。 与网络服务商签订合约 接入点或无线路由器 接

  • 我在mac OS HS 10.13.4上直接连接到我的路由器,没有代理。 我甚至试着删除所有的AVD,重新安装它们。我甚至试着用奥利奥Android 8.1安装了最新的Pixel 2 似乎什么都不起作用。有人面对这个问题并找到解决办法吗?

  • 可确认目前连接的接入点信息或网络的连接状态。