在上一篇文章Android即时网络监听(一)-BroadcastReceiver中,我们介绍了使用BroadcaastReceiver进行网络连接变化监听,虽然广播使用方便,但随着安卓的版本迭代,在权限上越来越谨慎,以及为了用户体验上的优化,广播就显得有点Low,所以我们本片,哦不,本文的主角就登场了:ConnectivityManager.NetworkCallback,关于它的具体描述,详见官方文档,下面我们来看一下具体使用。
1、新建NetworkCallbackImpl类继承ConnectivityManager.NetworkCallback,并重写onAvailable、onLost、onCapabilitiesChanged三个方法:
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Log.d(TAG, "onAvailable: 网络已连接");
}
@Override
public void onLost(Network network) {
super.onLost(network);
Log.e(TAG, "onLost: 网络已断开");
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
if (networkCapabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {
Log.d(TAG, "onCapabilitiesChanged: 网络类型为wifi");
post(NetType.WIFI);
} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {
Log.d(TAG, "onCapabilitiesChanged: 蜂窝网络");
post(NetType.CMWAP);
} else {
Log.d(TAG, "onCapabilitiesChanged: 其他网络");
post(NetType.AUTO);
}
}
}
2、注册NetworkCallbackImpl:
NetworkCallbackImpl networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
ConnectivityManager connMgr = (ConnectivityManager) NetworkListener.getInstance().getContext().getSystemService(Context.CONNECTIVITY_SERVICE);
if (connMgr != null) {
connMgr.registerNetworkCallback(request, networkCallback);
}
做完以上两步之后,运行代码,不出意外的话,网络状态改变就可以正常检测出来了,其余使用方法由于上一篇文章已经写明,本文就不再赘述,需要的童鞋可参考上一篇文章。
PS:本文为某平台公开课笔记,在此记录下,文中实现还可以再次进行优化。
代码详见Demo
另附上一篇文章链接Android即时网络监听(一)-BroadcastReceiver