前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >BroadcastReceiver获取手机网络状态

BroadcastReceiver获取手机网络状态

作者头像
张拭心 shixinzhang
发布2022-05-06 15:38:30
5910
发布2022-05-06 15:38:30
举报
文章被收录于专栏:拭心的安卓进阶之路
代码语言:javascript
复制
public class NetReceiver extends BroadcastReceiver {

	/**
	 * 枚举网络状态 NET_NO:没有网络 NET_2G:2g网络 NET_3G:3g网络 NET_4G:4g网络 NET_WIFI:wifi
	 * NET_UNKNOWN:未知网络
	 */
	public static enum NetState {
		NET_NO, NET_2G, NET_3G, NET_4G,NET_WIFI, NET_MOBILE, NET_UNKNOWN
	};

	public static List<NetEventHandle> ehList = new ArrayList<NetEventHandle>();

	public static interface NetEventHandle {
		/**
		 * 网络状态码
		 * 
		 * @param netCode
		 */
		void netState(NetState netCode);
	}

	@Override
	public void onReceive(Context context, Intent intent) {

		// 向所有实现接口的activity传递消息
		for (NetEventHandle e : ehList) {
			e.netState(isConnected(context));
		}

	}

	/**
	 * 判断当前是否网络连接
	 * 
	 * @param context
	 * @return 状态码
	 */
	public NetState isConnected(Context context) {
		NetState stateCode = NetState.NET_NO;
		ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
		NetworkInfo ni = cm.getActiveNetworkInfo();
		if (ni != null && ni.isConnectedOrConnecting()) {
			switch (ni.getType()) {
			case ConnectivityManager.TYPE_WIFI:
				stateCode = NetState.NET_WIFI;
				break;
			case ConnectivityManager.TYPE_MOBILE:
				switch (ni.getSubtype()) {
				case TelephonyManager.NETWORK_TYPE_GPRS: // 联通2g
				case TelephonyManager.NETWORK_TYPE_CDMA: // 电信2g
				case TelephonyManager.NETWORK_TYPE_EDGE: // 移动2g
				case TelephonyManager.NETWORK_TYPE_1xRTT:
				case TelephonyManager.NETWORK_TYPE_IDEN:
					stateCode = NetState.NET_2G;
					break;
				case TelephonyManager.NETWORK_TYPE_EVDO_A: // 电信3g
				case TelephonyManager.NETWORK_TYPE_UMTS:
				case TelephonyManager.NETWORK_TYPE_EVDO_0:
				case TelephonyManager.NETWORK_TYPE_HSDPA:
				case TelephonyManager.NETWORK_TYPE_HSUPA:
				case TelephonyManager.NETWORK_TYPE_HSPA:
				case TelephonyManager.NETWORK_TYPE_EVDO_B:
					// case TelephonyManager.NETWORK_TYPE_EHRPD:
					// case TelephonyManager.NETWORK_TYPE_HSPAP:
					stateCode = NetState.NET_3G;
					break;
				// case TelephonyManager.NETWORK_TYPE_LTE:
				// stateCode = NetState.NET_4G;
				// break;
				default:
					stateCode = NetState.NET_MOBILE;
				}
				break;
			default:
				stateCode = NetState.NET_UNKNOWN;
			}

		}
		return stateCode;
	}

}

别忘了在AndroidMinestfest.xml中静态注册:

代码语言:javascript
复制
<receiver android:name=".NetReceiver" >
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档