zoukankan      html  css  js  c++  java
  • NetStateReceiver【监听网路状态变化】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处!

    前言

    用来监控网络变化时的处理,一般用来toast提示或者扩展为其他作用。

    效果图

      

    代码分析

    NetStateReceiver:网络改变时的广播器

    NetUtils:获取网络类型

    使用步骤

    一、项目组织结构图

    注意事项:

    1、导入类文件后需要change包名以及重新import R文件路径

    2、Values目录下的文件(strings.xml、dimens.xml、colors.xml等),如果项目中存在,则复制里面的内容,不要整个覆盖

    二、导入步骤

    将netstatus包复制到项目中

    在AndroidManifest.xml文件中声明权限以及静态注册NetStateReceiver【注意,路径需要跟实际项目的路径保持一致】

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.why.project.netstatereceiverdemo">
    
        <!-- ======================NetStateReceiver相关========================== -->
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    
        <application
            android:name=".MyApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
    
            <!-- ===========NetStateReceiver相关=====也可以使用动态注册在MyApplication,不过需要注意注销的触发时机=============== -->
            <receiver android:name=".utils.netstatus.NetStateReceiver">
                <intent-filter>
                    <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
                    <action android:name="os.net.conn.CONNECTIVITY_CHANGE"/>
                </intent-filter>
            </receiver>
        </application>
    
    </manifest>

    在BaseActivity.java中添加以下代码

    package com.why.project.netstatereceiverdemo;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    
    import com.why.project.netstatereceiverdemo.utils.ToastUtil;
    import com.why.project.netstatereceiverdemo.utils.netstatus.NetChangeObserver;
    import com.why.project.netstatereceiverdemo.utils.netstatus.NetStateReceiver;
    import com.why.project.netstatereceiverdemo.utils.netstatus.NetUtils;
    
    
    /**
     * Created by HaiyuKing
     * Used Activity基类
     */
    
    public abstract class BaseActivity extends AppCompatActivity {
    
        private static final String TAG = "BaseActivity";
    
        /*=================网络变化的广播器=====================*/
        protected NetChangeObserver mNetChangeObserver;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
    
            /*=================网络变化的广播器=====================*/
            registerNetStateChange();//注册网络变化的广播器
    
            super.onCreate(savedInstanceState);
        }
    
        protected void onDestroy() {
            super.onDestroy();
            /*=================网络变化的广播器=====================*/
            NetStateReceiver.removeRegisterObserver(this.mNetChangeObserver);
        }
    
        /*==========网络变化的广播器=============*/
        private void registerNetStateChange() {
            if (this.mNetChangeObserver == null) {
                this.mNetChangeObserver = new NetChangeObserver() {
                    public void onNetConnected(NetUtils.NetType netType) {
                        super.onNetConnected(netType);
                        onNetworkConnected(netType);
                        if (NetUtils.isMobileConnected(getApplicationContext())){
                            ToastUtil.showShortToast("您当前正在使用运营商网络");
                        }
                        if(NetUtils.isWifiConnected(getApplicationContext())){
                            ToastUtil.showShortToast("您当前正在使用无线网络");
                        }
                    }
    
                    public void onNetDisConnect() {
                        super.onNetDisConnect();
                        onNetworkDisConnected();
                        ToastUtil.showShortToast("网络无法连接,请检查网络设置");
                    }
                };
                NetStateReceiver.registerObserver(this.mNetChangeObserver);// 声明mNetChangeObserver注册到网络状态广播接收器中
            }
        }
        protected abstract void onNetworkConnected(NetUtils.NetType netType);
        protected abstract void onNetworkDisConnected();
    
    }

    本Demo搭配《ToastUtil【简单的Toast封装类】【未自定义Toast的显示风格】》使用

    三、使用方法

    package com.why.project.netstatereceiverdemo;
    
    import android.os.Bundle;
    
    import com.why.project.netstatereceiverdemo.utils.netstatus.NetUtils;
    
    public class MainActivity extends BaseActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
        }
    
        @Override
        protected void onNetworkConnected(NetUtils.NetType netType) {
    
        }
    
        @Override
        protected void onNetworkDisConnected() {
    
        }
    }

    混淆配置

    参考资料

    http://www.cnblogs.com/renzimu/p/4537954.html

    http://www.cnblogs.com/renzimu/p/4537936.html

    项目demo下载地址

    https://github.com/haiyuKing/NetStateReceiverDemo

  • 相关阅读:
    VS2019调试 asp.net core 2.2 出现《ANCM In-Process Handler Load Failure 发布后启动错误处理》处理
    网页上显示数学公式的三种方案
    FileStream实现多线程断点续传(已封装)
    绝对定位不脱离文档流的方法
    百度地图InfoWindow弹窗圆角
    并发:线程池异步执行与创建单独的线程执行
    互斥锁和自旋锁的区别
    事务的特性和隔离级别
    线程不安全与线程安全示例
    多线程过去与现在
  • 原文地址:https://www.cnblogs.com/whycxb/p/7635299.html
Copyright © 2011-2022 走看看