android+8.0监听网络,监听网络变化--含7.0以上适配

/**

* 网络连接变化 监听帮助类

*

* 说明:

* 1、静态注册广播监听网络变化 的方式,{@link ConnectivityManager#CONNECTIVITY_ACTION}已有说明,

* 7.0及以后 静态注册的接收器不会收到 CONNECTIVITY_ACTION,只能用动态注册。(这是官方对广播权限的限制)

* 2、5.0后有新的api{@link ConnectivityManager.NetworkCallback} ,但是只能在app 存活时监听到。和动态注册效果类似,但有更多细节的回调。

*

* 综合这两点,本类实现方案:7.0及以后使用新api,只能在app存活时接收到回调;7.0以前使用静态注册广播。

*/

public class NetworkChangeListenHelper {

/**

* 网络不可用

*/

private static final int NETWORK_STATE_UNAVAILABLE = -1;

/**

* 网络可用

*/

private static final int NETWORK_STATE_AVAILABLE = 0;

// /**

// * 网络可用,且是移动数据

// */

// private static final int NETWORK_STATE_AVAILABLE_MOBILE = 1;

//

// /**

// * 网络可用,且是wifi

// */

// private static final int NETWORK_STATE_AVAILABLE_WIFI = 2;

private static NetworkChangeListener mNetworkChangeListener;

public boolean hasRegistNetworkCallback(){

return mNetworkChangeListener != null;

}

public void registerNetworkCallback(NetworkChangeListener networkChangeListener) {

if (hasRegistNetworkCallback()) {

XLogUtil.d("hasRegistNetworkCallback");

return;

}

mNetworkChangeListener = networkChangeListener;

//7.0及以后 使用这个新的api(7.0以前还是用静态注册广播)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {

ConnectivityManager connectivityManager = (ConnectivityManager) MyApplication.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);

// 请注意这里会有一个版本适配bug,所以请在这里添加非空判断

if (connectivityManager != null) {

NetworkRequest request = new NetworkRequest.Builder().build();

connectivityManager.registerNetworkCallback(request, new AkuNetworkCallback());

}

}

}

private void handleOnNetworkChange(int networkState) {

if (mNetworkChangeListener == null) {

return;

}

switch (networkState){

case NETWORK_STATE_UNAVAILABLE:

mNetworkChangeListener.onNetworkChange(false);

break;

case NETWORK_STATE_AVAILABLE:

mNetworkChangeListener.onNetworkChange(true);

break;

// case NETWORK_STATE_AVAILABLE_WIFI:

// mNetworkChangeListener.onNetworkChange(true);

// break;

default:

break;

}

}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)

public class AkuNetworkCallback extends ConnectivityManager.NetworkCallback{

@Override

public void onAvailable(Network network) {

super.onAvailable(network);

XLogUtil.d("网络连接了");

handleOnNetworkChange(NETWORK_STATE_AVAILABLE);

}

@Override

public void onLost(Network network) {

super.onLost(network);

XLogUtil.d("网络断开了");

handleOnNetworkChange(NETWORK_STATE_UNAVAILABLE);

}

@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)){

XLogUtil.d("wifi网络已连接");

// handleOnNetworkChange(NETWORK_STATE_AVAILABLE_WIFI);

}else {

XLogUtil.d("移动网络已连接");

// handleOnNetworkChange(NETWORK_STATE_AVAILABLE_MOBILE);

}

}

}

}

public static class NetworkChangeBroadcastReceiver extends BroadcastReceiver{

@Override

public void onReceive(Context context, Intent intent) {

//7.0以下用静态广播

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){

return;

}

if (intent == null) {

return;

}

if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {

return;

}

if (mNetworkChangeListener == null) {

return;

}

boolean noConnectivity = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);

mNetworkChangeListener.onNetworkChange(!noConnectivity);

}

}

/**

* NetworkChangeListener

*/

public interface NetworkChangeListener {

void onNetworkChange(boolean isNetworkAvailable);

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值