{"id":13645659,"url":"https://github.com/GHdeng/NetMonitor","last_synced_at":"2025-04-21T14:31:59.303Z","repository":{"id":217102698,"uuid":"69630967","full_name":"GHdeng/NetMonitor","owner":"GHdeng","description":"使用广播监听网络变化更新UI","archived":false,"fork":false,"pushed_at":"2024-02-27T00:52:26.000Z","size":339,"stargazers_count":120,"open_issues_count":2,"forks_count":34,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-11-09T18:43:18.709Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/GHdeng.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-09-30T03:37:06.000Z","updated_at":"2024-04-18T08:29:40.000Z","dependencies_parsed_at":null,"dependency_job_id":"6dcdd858-ee46-4e0d-884f-6c0de7f1e3c9","html_url":"https://github.com/GHdeng/NetMonitor","commit_stats":null,"previous_names":["ghdeng/netmonitor"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GHdeng%2FNetMonitor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GHdeng%2FNetMonitor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GHdeng%2FNetMonitor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/GHdeng%2FNetMonitor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/GHdeng","download_url":"https://codeload.github.com/GHdeng/NetMonitor/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250070238,"owners_count":21369841,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-02T01:02:39.228Z","updated_at":"2025-04-21T14:31:58.955Z","avatar_url":"https://github.com/GHdeng.png","language":"Java","readme":"# NetMonitor\n\n# 使用广播监听网络变化\n\n###需求确认\n\n* 监听当前网络的状态和类型\n* 类似京东客户端，当网络发生变化时相应更新UI界面\n\n![image](https://raw.githubusercontent.com/GHdeng/NetMonitor/master/NetMonitor2.gif)\n\ngithub地址：https://github.com/GHdeng/NetMonitor\n\n###制作流程\n1. 使用广播监听当前网络的状态。\n2. 配合Application周期注册监听，使得每个界面都继续监听\n3. 抽出BaseActivity类实现回调\n\n#####1.继承BroadcastReceiver实现onReceive方法来判断当前网络是否连接，然后通过更新NetChangeObserver来实现回调。\n加入权限\n```java\n\u003c uses-permission android:name=\"android.permission.INTERNET\" /\u003e\n\u003c uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\" /\u003e \n\u003c uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\" /\u003e\n```\n```java\n/**\n * 使用广播去监听网络\n * Created by deng on 16/9/13.\n */\npublic class NetStateReceiver extends BroadcastReceiver {\n\n    public final static String CUSTOM_ANDROID_NET_CHANGE_ACTION = \"com.zhanyun.api.netstatus.CONNECTIVITY_CHANGE\";\n    private final static String ANDROID_NET_CHANGE_ACTION = \"android.net.conn.CONNECTIVITY_CHANGE\";\n    private final static String TAG = NetStateReceiver.class.getSimpleName();\n\n    private static boolean isNetAvailable = false;\n    private static NetUtils.NetType mNetType;\n    private static ArrayList\u003cNetChangeObserver\u003e mNetChangeObservers = new ArrayList\u003cNetChangeObserver\u003e();\n    private static BroadcastReceiver mBroadcastReceiver;\n\n    private static BroadcastReceiver getReceiver() {\n        if (null == mBroadcastReceiver) {\n            synchronized (NetStateReceiver.class) {\n                if (null == mBroadcastReceiver) {\n                    mBroadcastReceiver = new NetStateReceiver();\n                }\n            }\n        }\n        return mBroadcastReceiver;\n    }\n\n    @Override\n    public void onReceive(Context context, Intent intent) {\n        mBroadcastReceiver = NetStateReceiver.this;\n        if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) {\n            if (!NetUtils.isNetworkAvailable(context)) {\n                LogHelper.e(this.getClass(), \"\u003c--- network disconnected ---\u003e\");\n                isNetAvailable = false;\n            } else {\n                LogHelper.e(this.getClass(), \"\u003c--- network connected ---\u003e\");\n                isNetAvailable = true;\n                mNetType = NetUtils.getAPNType(context);\n            }\n            notifyObserver();\n        }\n    }\n\n    /**\n     * 注册\n     *\n     * @param mContext\n     */\n    public static void registerNetworkStateReceiver(Context mContext) {\n        IntentFilter filter = new IntentFilter();\n        filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);\n        filter.addAction(ANDROID_NET_CHANGE_ACTION);\n        mContext.getApplicationContext().registerReceiver(getReceiver(), filter);\n    }\n\n    /**\n     * 清除\n     *\n     * @param mContext\n     */\n    public static void checkNetworkState(Context mContext) {\n        Intent intent = new Intent();\n        intent.setAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);\n        mContext.sendBroadcast(intent);\n    }\n\n    /**\n     * 反注册\n     *\n     * @param mContext\n     */\n    public static void unRegisterNetworkStateReceiver(Context mContext) {\n        if (mBroadcastReceiver != null) {\n            try {\n                mContext.getApplicationContext().unregisterReceiver(mBroadcastReceiver);\n            } catch (Exception e) {\n\n            }\n        }\n\n    }\n\n    public static boolean isNetworkAvailable() {\n        return isNetAvailable;\n    }\n\n    public static NetUtils.NetType getAPNType() {\n        return mNetType;\n    }\n\n    private void notifyObserver() {\n        if (!mNetChangeObservers.isEmpty()) {\n            int size = mNetChangeObservers.size();\n            for (int i = 0; i \u003c size; i++) {\n                NetChangeObserver observer = mNetChangeObservers.get(i);\n                if (observer != null) {\n                    if (isNetworkAvailable()) {\n                        observer.onNetConnected(mNetType);\n                    } else {\n                        observer.onNetDisConnect();\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * 添加网络监听\n     *\n     * @param observer\n     */\n    public static void registerObserver(NetChangeObserver observer) {\n        if (mNetChangeObservers == null) {\n            mNetChangeObservers = new ArrayList\u003cNetChangeObserver\u003e();\n        }\n        mNetChangeObservers.add(observer);\n    }\n\n    /**\n     * 移除网络监听\n     *\n     * @param observer\n     */\n    public static void removeRegisterObserver(NetChangeObserver observer) {\n        if (mNetChangeObservers != null) {\n            if (mNetChangeObservers.contains(observer)) {\n                mNetChangeObservers.remove(observer);\n            }\n        }\n    }\n}\n```\n\n#####2.回调接口\n``` java\n/**\n * 网络改变观察者，观察网络改变后回调的方法\n * Created by deng on 16/9/13.\n */\npublic interface NetChangeObserver {\n\n    /**\n     * 网络连接回调 type为网络类型\n     */\n     void onNetConnected(NetUtils.NetType type);\n\n    /**\n     * 没有网络\n     */\n     void onNetDisConnect();\n}\n```\n\n#####3.网络状态工具类\n```java\npublic class NetUtils {\n\n    public static enum NetType {\n        WIFI, CMNET, CMWAP, NONE\n    }\n\n    public static boolean isNetworkAvailable(Context context) {\n        ConnectivityManager mgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo[] info = mgr.getAllNetworkInfo();\n        if (info != null) {\n            for (int i = 0; i \u003c info.length; i++) {\n                if (info[i].getState() == NetworkInfo.State.CONNECTED) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    public static boolean isNetworkConnected(Context context) {\n        if (context != null) {\n            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();\n            if (mNetworkInfo != null) {\n                return mNetworkInfo.isAvailable();\n            }\n        }\n        return false;\n    }\n\n    public static boolean isWifiConnected(Context context) {\n        if (context != null) {\n            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n            NetworkInfo mWiFiNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);\n            if (mWiFiNetworkInfo != null) {\n                return mWiFiNetworkInfo.isAvailable();\n            }\n        }\n        return false;\n    }\n\n    public static boolean isMobileConnected(Context context) {\n        if (context != null) {\n            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n            NetworkInfo mMobileNetworkInfo = mConnectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);\n            if (mMobileNetworkInfo != null) {\n                return mMobileNetworkInfo.isAvailable();\n            }\n        }\n        return false;\n    }\n\n    public static int getConnectedType(Context context) {\n        if (context != null) {\n            ConnectivityManager mConnectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n            NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();\n            if (mNetworkInfo != null \u0026\u0026 mNetworkInfo.isAvailable()) {\n                return mNetworkInfo.getType();\n            }\n        }\n        return -1;\n    }\n\n    public static NetType getAPNType(Context context) {\n        ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);\n        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();\n        if (networkInfo == null) {\n            return NetType.NONE;\n        }\n        int nType = networkInfo.getType();\n\n        if (nType == ConnectivityManager.TYPE_MOBILE) {\n            if (networkInfo.getExtraInfo().toLowerCase(Locale.getDefault()).equals(\"cmnet\")) {\n                return NetType.CMNET;\n            } else {\n                return NetType.CMWAP;\n            }\n        } else if (nType == ConnectivityManager.TYPE_WIFI) {\n            return NetType.WIFI;\n        }\n        return NetType.NONE;\n    }\n}\n```\n\n#####4.在Application中注册\n```java\n    @Override\n    public void onCreate() {\n        super.onCreate();\n        instance = this;\n\n        /*开启网络广播监听*/\n         NetStateReceiver.registerNetworkStateReceiver(instance);\n    }\n    \n    @Override\n    public void onLowMemory() {\n        if (instance != null) {\n\t\t            NetStateReceiver.unRegisterNetworkStateReceiver(instance);\n            android.os.Process.killProcess(android.os.Process.myPid());\n            exitApp();\n        }\n        super.onLowMemory();\n    }\n```\n\n#####5.为了监听每一个Activity就抽取出来一个抽象类\n\n```java\t\n/**\n* 网络观察者\n*/\nprotected NetChangeObserver mNetChangeObserver = null;\n\n\t@Override\n    protected void onCreate(Bundle savedInstanceState) {\n// 网络改变的一个回掉类\n        mNetChangeObserver = new NetChangeObserver() {\n            @Override\n            public void onNetConnected(NetUtils.NetType type) {\n                onNetworkConnected(type);\n            }\n\n            @Override\n            public void onNetDisConnect() {\n                onNetworkDisConnected();\n            }\n        };\n\n        //开启广播去监听 网络 改变事件\n\t\t        NetStateReceiver.registerObserver(mNetChangeObserver);\n\t}\n\n\t/**\n     * 网络连接状态\n     *\n     * @param type 网络状态\n     */\n    protected abstract void onNetworkConnected(NetUtils.NetType type);\n\n    /**\n     * 网络断开的时候调用\n     */\n    protected abstract void onNetworkDisConnected();\n\n\t@Override\n    protected void onDestroy() {\n        super.onDestroy();\n        unbinder.unbind();\n\t\t             NetStateReceiver.removeRegisterObserver(mNetChangeObserver);\n    }\n```\n\n# Use\n##### Maven\n```java\n\u003cdependency\u003e\n  \u003cgroupId\u003ecom.caption\u003c/groupId\u003e\n  \u003cartifactId\u003enetmonitorlibrary\u003c/artifactId\u003e\n  \u003cversion\u003e1.0.0\u003c/version\u003e\n  \u003ctype\u003epom\u003c/type\u003e\n\u003c/dependency\u003e\n```\n\n##### Gradle\n```java\ncompile 'com.caption:netmonitorlibrary:1.0.0'\n```\n\n# License\n\tCopyright (c) 2016 GHdeng\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use this file except in compliance with the License.\n\tYou may obtain a copy of the License at\n\t\n\thttp://www.apache.org/licenses/LICENSE-2.0\n\n\tUnless required by applicable law or agreed to in writing, software\n\tdistributed under the License is distributed on an \"AS IS\" BASIS,\n\tWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\tSee the License for the specific language governing permissions and\n\tlimitations under the License.\n","funding_links":[],"categories":["其他"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGHdeng%2FNetMonitor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FGHdeng%2FNetMonitor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FGHdeng%2FNetMonitor/lists"}