写在前面:
直接复制 1 的工具类和 5 的两个类到项目中,就能使用哦,如果你不想看中间的过程的话。就是这么贴心的喔~
实现流程概括
首先,我们要实现实时监听,肯定要用到广播机制:Android系统在网络状态发生变化时会发送一条广播,所以我们首先要做的就是写一个广播接收器,接收这条广播。
那接收之后呢?
接收之后再通知所有的观察者,网络有变化了,这里就要用到观察者模式了。(不知道观察者模式也没关系,其实就和回调的机制差不多,不知道回调是什么的话…或许之后我会专门写一篇?)
over,就这么简单。
1、工具类(准备考试)
开始之前,复制这几个工具类到你的项目中,为后面的主要工作做准备。
首先是一个枚举,列举的是几种网络状态。
public enum NetworkType {
NETWORK_WIFI("WiFi"),
NETWORK_4G("4G"),
NETWORK_2G("2G"),
NETWORK_3G("3G"),
NETWORK_UNKNOWN("Unknown"),
NETWORK_NO("No network");
private String desc;
NetworkType(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return desc;
}
}
然后是一个网络工具类,用来返回网络连接状态的类型。
public class NetworkUtil {
private NetworkUtil() {
throw new UnsupportedOperationException("u can't instantiate me...");
}
@RequiresPermission("android.permission.ACCESS_NETWORK_STATE")
private static NetworkInfo getActiveNetworkInfo(Context context) {
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
return cm.getActiveNetworkInfo();
}
/**
* 获取当前网络类型
* 需添加权限 {@code <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>}
*/
@RequiresPermission("android.permission.ACCESS_NETWORK_STATE")
public static NetworkType getNetworkType(Context context) {
NetworkType netType = NetworkType.NETWORK_NO;
NetworkInfo info = getActiveNetworkInfo(context);
if (info != null && info.isAvailable()) {
if (info.getType() == ConnectivityManager.TYPE_WIFI) {
netType = NetworkType.NETWORK_WIFI;
} else if (info.getType() == ConnectivityManager.TYPE_MOBILE) {
switch (info.getSubtype()) {
case TelephonyManager.NETWORK_TYPE_TD_SCDMA:
case TelephonyManager.NETWORK_TYPE_EVDO_A:
case T