网络状态改变、用户信息改变(帐户的钱),第一时间就要想到用观察者模式来实现

广播接收者,简单地把网络的变化通过接口抛出去

package com.qkt.face.et.receiver;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.util.Log;import com.qkt.face.et.MyApplication;
import com.qkt.face.et.enums.NetworkType;
import com.qkt.face.et.utils.NetworkUtil;import java.util.ArrayList;
import java.util.List;public class NetStateChangeReceiver extends BroadcastReceiver {private static class InstanceHolder {private static final NetStateChangeReceiver INSTANCE = new NetStateChangeReceiver();}private List<NetStateChangeObserver> mObservers = new ArrayList<>();@Overridepublic void onReceive(Context context, Intent intent) {if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {NetworkType networkType = NetworkUtil.getNetworkType(context);Log.i("NetStateChangeReceiver", networkType.toString());notifyObservers(networkType);}}public static void registerReceiver(Context context) {IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);context.registerReceiver(InstanceHolder.INSTANCE, intentFilter);}public static void unRegisterReceiver(Context context) {context.unregisterReceiver(InstanceHolder.INSTANCE);}public static void registerObserver(NetStateChangeObserver observer) {if (observer == null) {return;}if (!InstanceHolder.INSTANCE.mObservers.contains(observer)) {InstanceHolder.INSTANCE.mObservers.add(observer);}}public static void unRegisterObserver(NetStateChangeObserver observer) {if (observer == null) {return;}if (InstanceHolder.INSTANCE.mObservers == null) {return;}InstanceHolder.INSTANCE.mObservers.remove(observer);}private void notifyObservers(NetworkType networkType) {if (networkType == NetworkType.NETWORK_NO) {for (NetStateChangeObserver observer : mObservers) {observer.onNetDisconnected();}} else {for (NetStateChangeObserver observer : mObservers) {observer.onNetConnected(networkType);}}}
}
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;}@Overridepublic String toString() {return desc;}
}

在需要的地方监听网络状态变化(记得销毁时删除监听器),一般在BaseActivity

public class BaseActivity extends AppCompatActivity implements NetStateChangeObserver {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);NetStateChangeReceiver.registerObserver(this);registerReceiver();}@Overrideprotected void onDestroy() {super.onDestroy();NetStateChangeReceiver.unRegisterObserver(this);unregisterReceiver();}@Overridepublic void onNetDisconnected() {ivNet.setImageResource(R.drawable.netError);}//设置网络图标@Overridepublic void onNetConnected(NetworkType networkType) {if (networkType.equals(NetworkType.NETWORK_WIFI) ) {getWifi();} else {ivNet.setImageResource(R.drawable.net_eth);}}//获取wifi信号强度private void getWifi() {//x心跳包请求成功,获取真实网速,请求失败,网络错误WifiManager wifi_service = (WifiManager) getContext().getApplicationContext().getSystemService(WIFI_SERVICE);WifiInfo wifiInfo = wifi_service.getConnectionInfo();int wStrength = Math.abs(wifiInfo.getRssi());if (wStrength < 50) {ivNet.setImageResource(R.drawable.net4);} else if (49 < wStrength && wStrength < 100) {ivNet.setImageResource(R.drawable.net3);} else if (100 < wStrength) {ivNet.setImageResource(R.drawable.net2);}}}
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 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:netType = NetworkType.NETWORK_3G;break;case TelephonyManager.NETWORK_TYPE_LTE:case TelephonyManager.NETWORK_TYPE_IWLAN:netType = NetworkType.NETWORK_4G;break;case TelephonyManager.NETWORK_TYPE_GSM:case TelephonyManager.NETWORK_TYPE_GPRS:case TelephonyManager.NETWORK_TYPE_CDMA:case TelephonyManager.NETWORK_TYPE_EDGE:case TelephonyManager.NETWORK_TYPE_1xRTT:case TelephonyManager.NETWORK_TYPE_IDEN:netType = NetworkType.NETWORK_2G;break;default:String subtypeName = info.getSubtypeName();if (subtypeName.equalsIgnoreCase("TD-SCDMA")|| subtypeName.equalsIgnoreCase("WCDMA")|| subtypeName.equalsIgnoreCase("CDMA2000")) {netType = NetworkType.NETWORK_3G;} else {netType = NetworkType.NETWORK_UNKNOWN;}break;}} else {netType = NetworkType.NETWORK_UNKNOWN;}}return netType;}
}

Android检测网络状态监听网络变化相关推荐

  1. Android通过使用系统广播监听网络状态的改变

    Android通过使用广播监听网络状态的改变 得先添加权限 //查看网络状态<uses-permission android:name="android.permission.ACCE ...

  2. 安卓APP在运行时对全局进行网络状态监听的实现

    转载自:https://blog.51cto.com/wangjinchan/4752142 感谢博主:一粒程序米 分享 一.前言 怎么对APP进行全局的网络监听呢?仿照微信的无网状态下弹出的提示,应 ...

  3. Android开发动态的监听网络状态的变化

    主要思路:使用Android中的四大组件之:BrocastReceiver监听网络状态的变化.接收到网络状态改变的广播之后判断当前的网络是否可用. 创建广播接收器MyNetworkReceiver p ...

  4. Android 通过WIFI状态监听广播,判断进入指定wifi范围

    原文地址:http://blog.csdn.net/kongxiuqi/article/details/52524500 --------------------------------------- ...

  5. 利用Reachability实现网络状态监听

    时刻检查设备的联网状态,并作出相应的处理,基本上是所有的联网程序需要考虑的问题,以前自己写个NSTimer 每多少卖哦循环一次,后来觉得这个思维有些不爽,就直接用Reachability来实现了 首先 ...

  6. Android开机自启监听网络改变源码

    先看下主页面代码 mainactivity.java package cn.xiayiye.networkchange;import android.app.Activity; import andr ...

  7. android 监听wifi的连接状态,Android判断wifi状态 监听wifi连接

    一.添加权限 二.注册监听广播 注册监听有两种方式 1.AndroidMainfest.xml 中注册 2.在代码中注册 IntentFilter filter = new IntentFilter( ...

  8. Android实时监听网络状态

    Android开发实时监听网络状态变化一般有两种方法: 1. 新建一个基类BasicActivity.class,在基类中注册网络监听广播NetworkChangeReceiver.class,所有页 ...

  9. 1.1.14 Electron 监听网络状态

    可以用window.addEventListener来进行时间监听网络状态 JavaScript的一种方式进行监听网络状态,监听的事件分别是online和offline. online : 如果链接上 ...

最新文章

  1. 文件的特殊权限:suid sgid sticky
  2. 牛津书虫系列双语读物
  3. 【机器学习】特征降维-主成分分析
  4. php实现一个简单的四则运算计算器
  5. [zz]linux下DHCP服务器配置(使用Ubuntu LTS 8.04)
  6. Java中带标签的break,continue
  7. 清华大学大数据研究中心成立
  8. commvault备份mysql,备份MySQL数据库的4种方式
  9. 【伙伴故事】智慧厨电接入华为云+HarmonyOS,你的未来厨房长这样
  10. jenkins没有参数化构建过程选项
  11. “System.OutOfMemoryException”类型的异常在 mscorlib.dll 中发生,但未在用户代码中进行处理
  12. 【commons-beanutils专题】003- PropertyUtils 专题
  13. linux改变cpu型号,怎么用linux查看cpu型号
  14. 鸿蒙能用谷歌地图,华为鸿蒙更进一步,牵手世界级应用,谷歌GMS或彻底再见
  15. 免费试用腾讯云服务器 + nginx建网站
  16. Django部署服务器
  17. Linux的自动装机服务器搭建(持续优化)
  18. C语言好学吗?C语言适合什么样的人群?
  19. java使用465端口发送邮件
  20. 分治法查找数组元素的最大值和最小值(python实现)

热门文章

  1. python: 七段数码管
  2. 关于在在Fragment中Edittext中不显示输入法
  3. 基于深度学习的三维重建算法综述
  4. 国外问卷调查是骗人的吗?
  5. 团队建设的一些思考和实践
  6. 截取计算机全屏画面的方法有,全屏截图快捷键的快捷键是什么
  7. 计算机毕业设计(附源码)python自助旅游平台
  8. redis_主从复制搭建
  9. 移动直播之网红主播怎样将直播内容推到斗鱼直播平台的方案
  10. web课程设计-照片记录网站(Flask)【web项目】