权限:
1. 获取当前网络状态
(1)获取ConnectivityManager实例:
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
(2)获取存在的NetworkInfo对象:
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
(3)networkInfo.getType()方法区分wifi模式和数据流量模式
if (networkInfo != null && networkInfo.isConnected()) {
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return NETWORK_MOBILE;
} else if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI){
return NETWORK_WIFI;
}
}
return NETWORK_NONE;
}
(4)info.getSubtype() 区分具体网络连接信息
info.getSubtype()取值列表如下:
NETWORK_TYPE_CDMA 网络类型为CDMA
NETWORK_TYPE_EDGE 网络类型为EDGE
NETWORK_TYPE_EVDO_0 网络类型为EVDO0
NETWORK_TYPE_EVDO_A 网络类型为EVDOA
NETWORK_TYPE_GPRS 网络类型为GPRS
NETWORK_TYPE_HSDPA 网络类型为HSDPA
NETWORK_TYPE_HSPA 网络类型为HSPA
NETWORK_TYPE_HSUPA 网络类型为HSUPA
NETWORK_TYPE_UMTS 网络类型为UMTS
联通的3G为UMTS或HSDPA,移动和联通的2G为GPRS或EDGE,电信的2G为CDMA,电信的3G为EVDO
这个方法可用于具体的一些网络判断操作,比如只有4G网络下可加载等特殊情况。
2. 监听网络状态变化
每当网络连接状态发生了变化,ConnectivityManager会广播一个CONNECTIVITY_ACTION(“android.net.conn.CONNECTIVITY_CHANGE”)。
可以注册一个广播接收器接收网络连接变化的广播。
//注册监听网络广播(4.0以后动态注册)
IntentFilter filter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
NetStateReceiver netStateReceiver=new NetStateReceiver();
registerReceiver(netStateReceiver,filter);
netStateReceiver.setmListener(this);
网络状态变化,触发onReceive(), 通过接口回调传给主线程,更新界面
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
int netWorkState = NetUtils.getNetWorkState(context);
if (mListener != null) {
//调用此接口传递进去你要传递的值(这里只是网络状态)
mListener.ChangeListener(netWorkState);
}
}
}
}
回调接口
/**
* 网络变化回调接口
*/
//1,接口声明
public interface NetChangeListener{
void ChangeListener(int status);
}
//2,创建接口“实例”
NetChangeListener mListener;
//3,添加set方法供外界使用
public void setmListener(NetChangeListener mListener) {
this.mListener = mListener;
}
主线程绑定并更新
mNetBroadcastReceiver.setmListener(this);
@Override
public void onNetChangeListener(int status) {
if (mNetState == status) {
return;
}
mNetState = status;
if (status == NetUtils.NETWORK_NONE) {
ToastUtils.show("网络已断开");
showNetDialog();
} else if (status == NetUtils.NETWORK_MOBILE || status == NetUtils.NETWORK_WIFI) {
ToastUtils.show("网络已连接");
hideNetDialog();
}
}
手机连接真机:
- 在设置中,找到版本号,点击多次,打开“开发者模式”;
- 在开发者模式中打开usb调试开关;
- 选择文件传输模式(MTP)。
完整小demo模拟机测试:
NetworksUtils.class(封装的网络工具类)
package com.example.network.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
public class NetworksUtils {
public static int getNetworkState(Context context) {
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = manager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE) {
return 1;
} else if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI) {
return 2;
}
}
return 0;
}
}
NetStateReceiver.class(广播下声明接口)
package com.example.network;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import com.example.network.utils.NetworksUtils;
public class NetStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction() != null) {//是否为空,是否变化
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {//判断是否连上
int netWorkState = NetworksUtils.getNetworkState(context);//当前网络状态
//4,使用接口传递数据——(这里是网络状态)
mListener.ChangeListener(netWorkState);
}
}
}
}
//1,接口声明
public interface NetChangeListener{
void ChangeListener(int status);
}
//2,创建接口“实例”
NetChangeListener mListener;
//3,添加set方法供外界使用
public void setmListener(NetChangeListener mListener) {
this.mListener = mListener;
}
}
MainActivity.class(活动类中去实现广播中的接口来实现实时判断网络的状态并弹出相应提升):
package com.example.network;
import android.content.IntentFilter;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
import com.example.network.utils.NetworksUtils;
public class MainActivity extends AppCompatActivity
{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始状态显示
int state= NetworksUtils.getNetworkState(getApplicationContext());
showToast( state);
//动态注册
IntentFilter filter=new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
NetStateReceiver netStateReceiver=new NetStateReceiver();
registerReceiver(netStateReceiver,filter);
//实现了接口并重写了刚刚做的那个自定义接口中的ChangeListener方法
netStateReceiver.setmListener(new NetStateReceiver.NetChangeListener() {
@Override
public void ChangeListener(int status) {
showToast(status);
}
});
}
//写的一个显示网络状态消息的方法
void showToast(int state){
switch (state){
case 0:
Toast.makeText(this, "断网啦~", Toast.LENGTH_SHORT).show();
break;
case 1:
Toast.makeText(this, "手机流量", Toast.LENGTH_SHORT).show();
break;
case 2:
Toast.makeText(this, "WIFI数据", Toast.LENGTH_SHORT).show();
break;
}
}
}