今天先在这里分享一个网络监听器,附带:网络连接状态变化,自动刷新。
这里主要监听的是网络连接状态的变化。
思路是,通过开启service与BroadcastReceiver 一起做连接状态的监听。
二话不说,贴上代码:
先写服务ReceiveMsgService:
/**
* Created by Troy on 2017/4/27.
* 系统网络连接相关的操作管理类.
* // 实时监听网络状态改变
*/
public class ReceiveMsgService extends Service {
public static final String NETWORKSTATE = "com.text.android.network.state"; // An action name
/**
* 当前处于的网络
* 0 :null
* 1 :2G/3G
* 2 :wifi
*/
public static int networkStatus;
private ConnectivityManager connectivityManager;
// Describes the status of a network interface.
// 网络状态信息的实例
private NetworkInfo info;
private GetConnectState onGetConnectState;
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//当前接受到的广播的标识(行动/意图)
String action = intent.getAction();
// 当前接受到的广播的标识(意图)为网络状态的标识时做相应判断
if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
// 获取网络连接管理器
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
/*
获取当前网络状态信息
info.isAvailable();//当前网络是否有效
info.isConnected();//当前网络是否已连接
info.getTypeName();//网络类型“WIFI”或“MOBILE”
getReason();//获取连接失败的原因。
*/
info = connectivityManager.getActiveNetworkInfo();
if (info != null && info.isAvailable() && info.isConnected()) {
MLog.e(getClass().getName(), "======当前网络可用====");
//当NetworkInfo不为空且是可用,并且是已连接状态的情况下,获取当前网络的Type状态
//根据NetworkInfo.getTypeName()判断当前网络
String name = info.getTypeName();
//更改NetworkStateService的静态变量,之后只要在Activity中进行判断就好了
if (name.equals("WIFI")) {
networkStatus = 2;
MLog.e(getClass().getName(), "======有WIFI网络了====");
} else {
networkStatus = 1;
MLog.e(getClass().getName(), "======没有WIFI网络了====");
}
} else {
// NetworkInfo为空或者是不可用的情况下
networkStatus = 0;
MLog.e(getClass().getName(), "======当前没有可用网络了====");
Intent it = new Intent();
it.putExtra("networkStatus", networkStatus);
it.setAction(NETWORKSTATE);
sendBroadcast(it); //发送无网络广播给注册了当前服务广播的Activity
}
Timer timer = new Timer();
timer.schedule(new QunXTask(getApplicationContext()), new Date());
}
}
};
private Binder binder = new MyBinder();
private boolean isContected = false;
public void setOnGetConnectState(GetConnectState onGetConnectState) {
this.onGetConnectState = onGetConnectState;
}
@Override
public IBinder onBind(Intent intent) {
return binder;
}
@Override
public void onCreate() {// 注册广播
//2.创建intent-filter对象
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 添加接收网络连接状态改变的Action
registerReceiver(mReceiver, mFilter);
}
@Override
public void onDestroy() {
super.onDestroy();
unregisterReceiver(mReceiver); // 删除广播
}
// 网络状态改变之后,通过此接口的实例通知当前网络的状态,此接口在Activity中注入实例对象
public interface GetConnectState {
void GetState(boolean isConnected);
}
class QunXTask extends TimerTask {
private Context context;
public QunXTask(Context context) {
this.context = context;
}
@Override
public void run() {
isContected = isNetworkConnected(context) || isWifiConnected(context);
if (onGetConnectState != null) {
onGetConnectState.GetState(isContected); // 通知网络状态改变
// YouPinLog.i(getClass(), "通知网络状态改变:" + isContected);
}
}
/*
* 判断是3G否有网络连接
*/
private boolean isNetworkConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();
if (mNetworkInfo != null && mNetworkInfo.isAvailable() && mNetworkInfo.isConnected()) {
MLog.e(getClass().getName(), "mNetworkInfo===keyong=" + mNetworkInfo.isConnected());
return true;
}
}
return false;
}
/*
* 判断是否有wifi连接
*/
private boolean isWifiConnected(Context context) {
if (context != null) {
ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if (mWiFiNetworkInfo != null && mWiFiNetworkInfo.isAvailable() && mWiFiNetworkInfo.isConnected()) {
MLog.e(getClass().getName(), "mWiFiNetworkInfo====" + mWiFiNetworkInfo.isAvailable());
return true;
}
}
return false;
}
}
public class MyBinder extends Binder {
public ReceiveMsgService getService() {
return ReceiveMsgService.this;
}
}
}
在Mainfest中注册:
<service android:name=".service.ReceiveMsgService">
<intent-filter android:priority="1000">
<action android:name="com.dahanis.zjgj.service.ReceiveMsgService" />
</intent-filter>
</service>
在MainActivity中绑定和解绑方法:
private void bindService() {
Intent intent = new Intent(HomeActivity.this, ReceiveMsgService.class);
intent.setAction(NETWORKSTATE);
bindService(intent, serviceConnection, BIND_AUTO_CREATE);
}
private void unbind() {
if (receiveMsgService != null) {
unbindService(serviceConnection);
MLog.d(getClass().getName(), "执行unbind()");
}
}
分别于OnCreate()和onDestroy()方法中,调用bindService()方法和unbind()方法。同时创建connection。
public static final int NET_WORK_OK = 0x15;
public static final int NET_WORK_NO = 0x16;
// 记录当前连接状态,因为广播会接收所有的网络状态改变wifi/3g等等,所以需要一个标志记录当前状态
private boolean conncetState = true;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
receiveMsgService = ((ReceiveMsgService.MyBinder) service)
.getService();
receiveMsgService.setOnGetConnectState(new ReceiveMsgService.GetConnectState() { // 添加接口实例获取连接状态
@Override
public void GetState(boolean isConnected) {
if (conncetState != isConnected) { // 如果当前连接状态与广播服务返回的状态不同才进行通知显示
conncetState = isConnected;
if (conncetState) {// 已连接
mHandler.sendEmptyMessage(NET_WORK_OK);
} else {// 未连接
mHandler.sendEmptyMessage(NET_WORK_NO);
}
}
}
});
}
};
//暴露setHandler方法,方便后续其他fragment调用
public void setHandler(Handler handler) {
this.mHandler = handler;
}
fragment中的调用:
private HomeActivity homeActivity;
private Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
switch (msg.what) {
case HomeActivity.NET_WORK_NO:
MyToast.showMessage("亲,请保持网络畅通!");
break;
case HomeActivity.NET_WORK_OK:
initMainData();
break;
}
return false;
}
});
@Override
public void onAttach(Context context) {
super.onAttach(context);
homeActivity = (HomeActivity) context;
homeActivity.setHandler(handler);
}
大致思路就是如此。