原文(参考学习):https://blog.csdn.net/mxiaoyem/article/details/50708052

在网络上看到了该文章,讲的是如何实时监测网络状态, 本人菜鸟一枚,学习该文章,照着代码敲. 感谢该博主的无私分享。

1. 在AndroidManifest.xml中添加权限

2. 新建工具类

public class NetUtil {    /**     * 没有连接网络     */    private static final int NETWORK_NONE = -1;    /**     * 移动网络     */    private static final int NETWORK_MOBILE = 0;    /**     * 无线网络     */    private static final int NETWORK_WIFI = 1;    public static int getNetWorkState(Context context) {        // 得到连接管理器对象        ConnectivityManager connectivityManager = (ConnectivityManager) context                .getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo activeNetworkInfo = connectivityManager                .getActiveNetworkInfo();        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {                return NETWORK_WIFI;            } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {                return NETWORK_MOBILE;            }        } else {            return NETWORK_NONE;        }        return NETWORK_NONE;    }}

4. 建立接收器

public class NetBroadcastReceiver extends BroadcastReceiver {    public NetEvent event= BaseActivity.event;    @Override    public void onReceive(Context context, Intent intent) {        // 如果相等的话就说明网络状态发生了变化        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {            int netWorkState = NetUtil.getNetWorkState(context);            // 接口回调传过去状态的类型            event.onNetChange(netWorkState);        }    }    //自定义网络切换接口    public interface NetEvent {        public void onNetChange(int netMobile);    }}

由于我自己的测试机子是Android 8.0, 我在接下来的BaseActivity中,采取动态注册,看了原博主的文章,Android 7.0(含)以上需要动态注册,如果是低于这个版本,需要在AndroidManifest.xml添加如下代码, 我的设备是Android 8.0, 就没有添加了。

                                    

4. 定义抽象基类BaseActivity当中,进行实现

public abstract class BaseActivity extends AppCompatActivity implements NetBroadcastReceiver.NetEvent

在BaseActivity当中,定义

    public NetBroadcastReceiver netBroadcastReceiver;    public static NetBroadcastReceiver.NetEvent event;    private int netMobile;

在onCreate当中,进行接收器动态注册:

        event= this;        //实例化IntentFilter对象        IntentFilter filter = new IntentFilter();        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);        filter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        netBroadcastReceiver = new NetBroadcastReceiver();        registerReceiver(netBroadcastReceiver, filter);

在onDestroy当中释放

unregisterReceiver(netBroadcastReceiver);

添加处理方法

    public boolean inspectNet() {        this.netMobile = NetUtil.getNetWorkState(BaseActivity.this);        return isNetConnect();    }    /**     * 判断有无网络 。     *     * @return true 有网, false 没有网络.     */    public boolean isNetConnect() {        if (netMobile == 1) {            return true;        } else if (netMobile == 0) {            return true;        } else if (netMobile == -1) {            return false;        }        return false;    }

5. 由于BaseActivity是一个抽象类,虽然实现了NetBroadcastReceiver.NetEvent, 但是并无实现方法。 由BaseActivity的子类实现。比如InitActivity继承BaseActivity,

public class InitActivity extends BaseActivity

由InitActivity中实现onNetChange方法, 当在InitActivity对应布局时,网络变化时,会自动触发该事件,我定义了一个变量特地用来存储网络状态, 用于之后的逻辑判断使用.

    @Override    public void onNetChange(int netMobile) {        MyApplication.NET_STATUS= netMobile;    }

此时可能会发现, 这样做的话,需要在每一个BaseActivity的子类都要实现这个方法,会比较繁琐。那么BaseActivity就不能写成抽象类, 直接在BaseActivity实现就可以了。以后会注意。

特此记录下使用, 方便以后使用。

更多相关文章

  1. 子线程更新UI的方法
  2. Android真机测试 INSTALL_FAILED_INSUFFICIENT_STORAGE 解决方法
  3. Android 网络框架 android-async-http
  4. Android沉浸式状态栏的开发
  5. Android如何设置顶部状态栏颜色(主题)
  6. 安卓(android)建立项目时失败,出现Android Manifest.xml file missi
  7. Android——Listview不用notifydatasetchanged更新数据的方法
  8. Android中两种使用Animation的方法
  9. 详解Android aidl的使用方法

随机推荐

  1. 如何将蓝牙鼠标或触控板连接到 iPad?
  2. ORACLE 回滚段详解
  3. 【机器学习实战】垃圾分类快速理解机器学
  4. Python爬取4000条猫眼评论,带你围观2021最
  5. Tomcat日常维护笔记 - 运维小结
  6. 【论文解读】UniLM:一种既能阅读又能自动
  7. 【MOS】如何利用RMAN可传输表空间迁移数
  8. Java SPI机制与Thread Context Classload
  9. 如何在 指定文件夹 快速打开 jupyter not
  10. MyBatis传入参数为list 数组 map