直接在BaseActivity中引下面代码:
private ConnectivityManager.NetworkCallback networkCallback;
private ConnectivityManager connectivityManager;
//网络监听
networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(request, networkCallback);
private class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
/**
* 网络可用的回调连接成功
*/
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
mHandler.post(new Runnable() {
@Override
public void run() {
if (mNetErrorView != null) {
mNetErrorView.setVisibility(View.GONE);
}
}
});
}
/**
* 实践中在网络连接正常的情况下,丢失数据会有回调
*/
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
}
/**
* 网络不可用时调用和onAvailable成对出现
*/
@Override
public void onLost(Network network) {
super.onLost(network);
mHandler.post(new Runnable() {
@Override
public void run() {
if (mNetErrorView != null) {
mNetErrorView.setVisibility(View.VISIBLE);
}
}
});
}
}
mNetErrorView 是无网络时显示的一个view,写一个这个view的布局net_status_bar.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/net_status_bar_top"
android:layout_width="match_parent"
android:layout_height="@dimen/net_height"
android:background="@drawable/net_warning_bar_bg"
android:clickable="true"
android:gravity="center_vertical"
android:paddingLeft="@dimen/padding_normal"
android:visibility="gone" >
<TextView
android:id="@+id/net_status_bar_info_top"
android:layout_width="0.0dip"
android:layout_height="match_parent"
android:layout_gravity="center_vertical"
android:layout_marginRight="@dimen/margin_normal"
android:layout_weight="1.0"
android:drawableLeft="@drawable/net_warning"
android:drawablePadding="@dimen/padding_normal"
android:gravity="center_vertical"
android:text="@string/net_state_info"
android:textColor="@color/black"
android:textSize="@dimen/font_size_normal" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="@dimen/margin_normal"
android:contentDescription="@string/app_name"
android:src="@drawable/net_warning_redirect"
android:visibility="gone" />
</LinearLayout>
再在需要用到网络监听的Activity中继承BaseActivity,再在当前Activity中
mNetErrorView = findViewById(R.id.net_status_bar_top);
最后在当前Activity的布局中适当的位置引入这个布局文件即可
<include layout="@layout/net_status_bar" />
到此就完成了实时网络监听
如果需要已进入就监听到网络,需要在BaseActivity的onResume中监听
if (!NetUtil.isNetConnected(this)) {
if (mNetErrorView != null) {
mNetErrorView.setVisibility(View.VISIBLE);
}
} else {
if (mNetErrorView != null) {
mNetErrorView.setVisibility(View.GONE);
}
}
监听代码
public static boolean isNetConnected(Context context) {
boolean isNetConnected;
// 获得网络连接服务
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo info = connManager.getActiveNetworkInfo();
if (info != null && info.isAvailable()) {
// String name = info.getTypeName();
isNetConnected = true;
} else {
isNetConnected = false;
}
return isNetConnected;
}
再在onDestroy中取消注册
connectivityManager.unregisterNetworkCallback(networkCallback);
上面代码中所需要的一些尺寸,图片等可以自行先随意设置,先看效果,后期可换成项目所需的对应资源
最近自己写了一个小程序,大家可以关注一下,附带源码:
搬砖之余看个电影放松,扫码关注,最新,最全的各种影视资源,省去各种VIP,直接观看,你值得拥有