Android判断网络状态监听网路状态

时间:2022-11-02 09:00:32


在Android开发过程中,为了用户体验,比如微信等软件,都会在网络不可用或有问题时,提示用户不可用,因此开发者需要判断网络状态并且实时监听,网上也搜了很多方法,比如使用​​BroadCastReceiver​​,也有使用ping一个外网链接比如百度的,还有通过DNS连接来判断的,但是发现都不是很好用,尤其是ping的,很不优雅,有时候返回结果还不一定正确。

最后找到一个方法,亲测比较好使,分享出来。

我们上面说到的解决方案,看了下发布时间,一般都是比较早的文章了,其实随着Android迭代,有了更好的替代方式,那就是:​​ConnectivityManager.NetworkCallback​​。

具体的介绍大家可以参考官方文档:​​官方链接点击进入》》》​

下面我们直接说使用方法:

第一步:新建一个类继承​​ConnectivityManager.NetworkCallback​​​,并且重写里面的方法(主要是​​onAvailable​​​和​​onLost​​)。

public class NetworkStatusCallback extends ConnectivityManager.NetworkCallback {



private static final String TAG = "NetworkStatusCallback";



private Context context;

private ConnectivityManager manager;



public NetworkStatusCallback(Context context) {

this.context = context;

this.manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

}



@Override

public void onAvailable(Network network) {

super.onAvailable(network);

//调用判断

isNetworkEnable();

}



@Override

public void onLosing(Network network, int maxMsToLive) {

super.onLosing(network, maxMsToLive);

}



@Override

public void onLost(Network network) {

super.onLost(network);

//调用判断

isNetworkEnable();

}



@Override

public void onUnavailable() {

super.onUnavailable();

}



@Override

public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {

super.onCapabilitiesChanged(network, networkCapabilities);

}



@Override

public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {

super.onLinkPropertiesChanged(network, linkProperties);

}



/**

* 为什么每次都要判断,原因是WIFI和蜂窝网络都可用时,如果只是断掉WIFI,也会调用onLoss方法,所以改为只判断当前可用的,无论是哪个

*/

private void isNetworkEnable() {

NetworkInfo active = manager.getActiveNetworkInfo();

boolean result = null != active &&

active.getState() == NetworkInfo.State.CONNECTED;

//下面根据结果,发送事件或者做业务操作

}





}

第二步:注册监听(我选择在​​MyApplication​​里)。

NetworkStatusCallback listener = new NetworkStatusCallback(getApplicationContext());

ConnectivityManager connMgr = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);

if (connMgr != null) {

//这里只监听了WIFI和蜂窝网络,正常APP够用了,如果有其他要求,可以增加

NetworkRequest nr = new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI)

.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)

.build();

connMgr.registerNetworkCallback(nr, listener);

}

以上就完成了网络状态的监听,怎么样,可以试试看是否好用。