From a526931e39f977dc84dd08639b01e1260fdb1d21 Mon Sep 17 00:00:00 2001
From: 18034727885 <973609879@qq.com>
Date: 星期一, 15 六月 2026 10:56:41 +0800
Subject: [PATCH] 修复问题

---
 xldUtils/src/main/java/cn/sinata/xldutils/netstatus/NetStateReceiver.java |  206 ++++++++++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 185 insertions(+), 21 deletions(-)

diff --git a/xldUtils/src/main/java/cn/sinata/xldutils/netstatus/NetStateReceiver.java b/xldUtils/src/main/java/cn/sinata/xldutils/netstatus/NetStateReceiver.java
index 7656d8f..7d223e1 100644
--- a/xldUtils/src/main/java/cn/sinata/xldutils/netstatus/NetStateReceiver.java
+++ b/xldUtils/src/main/java/cn/sinata/xldutils/netstatus/NetStateReceiver.java
@@ -4,10 +4,18 @@
 import android.content.Context;
 import android.content.Intent;
 import android.content.IntentFilter;
+import android.net.ConnectivityManager;
+import android.net.Network;
+import android.net.NetworkCapabilities;
+import android.net.NetworkRequest;
+import android.os.Build;
+import android.os.Handler;
+import android.os.Looper;
 
-import cn.sinata.xldutils.utils.Utils;
+import androidx.annotation.RequiresApi;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  *网络状态监听
@@ -20,6 +28,14 @@
     private static NetUtils.NetType mNetType;
     private static ArrayList<NetChangeObserver> mNetChangeObservers = new ArrayList<NetChangeObserver>();
     private static BroadcastReceiver mBroadcastReceiver;
+    // 保存应用级上下文,避免页面上下文被静态监听器持有 由AI生成
+    private static Context mAppContext;
+    // 记录注册次数,防止多个页面互相注销同一个全局监听 由AI生成
+    private static int mRegisterCount = 0;
+    // 网络回调对象用于 Android 5.0 及以上系统监听网络变化 由AI生成
+    private static ConnectivityManager.NetworkCallback mNetworkCallback;
+    // 主线程 Handler 用于把网络回调分发回 UI 安全线程 由AI生成
+    private static final Handler MAIN_HANDLER = new Handler(Looper.getMainLooper());
 
     private static BroadcastReceiver getReceiver() {
         if (null == mBroadcastReceiver) {
@@ -37,33 +53,64 @@
         mBroadcastReceiver = NetStateReceiver.this;
         if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(CUSTOM_ANDROID_NET_CHANGE_ACTION)) {
 //            Utils.systemErr("111111111");
-            if (!NetUtils.isNetworkAvailable(context)) {
-                isNetAvailable = false;
-            } else {
-                isNetAvailable = true;
-                mNetType = NetUtils.getAPNType(context);
-            }
+            updateNetworkState(context);
             notifyObserver();
         }
     }
 
     public static void registerNetworkStateReceiver(Context mContext) {
-        IntentFilter filter = new IntentFilter();
-        filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
-        filter.addAction(ANDROID_NET_CHANGE_ACTION);
-        mContext.registerReceiver(getReceiver(), filter);
+        if (mContext == null) {
+            return;
+        }
+        mAppContext = mContext.getApplicationContext();
+        if (mRegisterCount++ > 0) {
+            updateNetworkState(mAppContext);
+            return;
+        }
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+            registerNetworkCallback(mAppContext);
+        } else {
+            IntentFilter filter = new IntentFilter();
+            filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
+            filter.addAction(ANDROID_NET_CHANGE_ACTION);
+            mAppContext.registerReceiver(getReceiver(), filter);
+        }
+        updateNetworkState(mAppContext);
     }
 
     public static void checkNetworkState(Context mContext) {
-        Intent intent = new Intent();
-        intent.setAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
-        mContext.sendBroadcast(intent);
+        if (mContext == null) {
+            return;
+        }
+        updateNetworkState(mContext);
+        notifyObserver();
     }
 
     public static void unRegisterNetworkStateReceiver(Context mContext) {
+        if (mContext == null || mRegisterCount <= 0) {
+            return;
+        }
+        mRegisterCount--;
+        if (mRegisterCount > 0) {
+            return;
+        }
+        Context appContext = mContext.getApplicationContext();
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && mNetworkCallback != null) {
+            try {
+                ConnectivityManager connectivityManager = (ConnectivityManager) appContext.getSystemService(Context.CONNECTIVITY_SERVICE);
+                if (connectivityManager != null) {
+                    connectivityManager.unregisterNetworkCallback(mNetworkCallback);
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            } finally {
+                mNetworkCallback = null;
+            }
+            return;
+        }
         if (mBroadcastReceiver != null) {
             try {
-                mContext.unregisterReceiver(mBroadcastReceiver);
+                appContext.unregisterReceiver(mBroadcastReceiver);
             } catch (Exception e) {
                 e.printStackTrace();
             }
@@ -79,11 +126,10 @@
         return mNetType;
     }
 
-    private void notifyObserver() {
+    private static void notifyObserver() {
         if (!mNetChangeObservers.isEmpty()) {
-            int size = mNetChangeObservers.size();
-            for (int i = 0; i < size; i++) {
-                NetChangeObserver observer = mNetChangeObservers.get(i);
+            List<NetChangeObserver> observers = new ArrayList<NetChangeObserver>(mNetChangeObservers);
+            for (NetChangeObserver observer : observers) {
                 if (observer != null) {
                     if (isNetworkAvailable()) {
                         observer.onNetConnected(mNetType);
@@ -99,7 +145,9 @@
         if (mNetChangeObservers == null) {
             mNetChangeObservers = new ArrayList<NetChangeObserver>();
         }
-        mNetChangeObservers.add(observer);
+        if (observer != null && !mNetChangeObservers.contains(observer)) {
+            mNetChangeObservers.add(observer);
+        }
     }
 
     public static void removeRegisterObserver(NetChangeObserver observer) {
@@ -109,4 +157,120 @@
             }
         }
     }
-}
\ No newline at end of file
+
+    // 注册系统网络回调以替代高版本系统上不可靠的 CONNECTIVITY_CHANGE 广播 由AI生成
+    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
+    private static void registerNetworkCallback(final Context context) {
+        // 获取系统网络服务用于注册 NetworkCallback 由AI生成
+        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
+        // 网络服务为空时保持原有状态并直接返回 由AI生成
+        if (connectivityManager == null) {
+            return;
+        }
+        // 避免重复创建网络回调对象 由AI生成
+        if (mNetworkCallback != null) {
+            return;
+        }
+        // 创建网络变化回调对象 由AI生成
+        mNetworkCallback = new ConnectivityManager.NetworkCallback() {
+            // 网络可用时刷新当前网络状态 由AI生成
+            @Override
+            public void onAvailable(Network network) {
+                // 切回主线程分发,避免页面回调在 Binder 线程更新 UI 由AI生成
+                dispatchNetworkChanged(context);
+            }
+
+            // 网络能力变化时刷新当前网络状态 由AI生成
+            @Override
+            public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
+                // 切回主线程分发最新联网能力 由AI生成
+                dispatchNetworkChanged(context);
+            }
+
+            // 网络丢失时重新查询当前活动网络,兼容 Wi-Fi 与移动网络切换 由AI生成
+            @Override
+            public void onLost(Network network) {
+                // 切回主线程后再通知观察者 由AI生成
+                dispatchNetworkChanged(context);
+            }
+        };
+        try {
+            // 只监听具备互联网能力的网络,减少无效网络状态回调 由AI生成
+            NetworkRequest request = new NetworkRequest.Builder().addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET).build();
+            // 向系统注册网络变化回调 由AI生成
+            connectivityManager.registerNetworkCallback(request, mNetworkCallback);
+        } catch (Exception e) {
+            // 注册失败时打印异常并回退到旧广播路径 由AI生成
+            e.printStackTrace();
+            // 清空失败的回调对象,避免后续注销不存在的系统回调 由AI生成
+            mNetworkCallback = null;
+            // 使用旧广播监听作为兜底方案 由AI生成
+            registerLegacyReceiver(context);
+        }
+    }
+
+    // 注册旧版网络广播监听作为低版本或异常兜底 由AI生成
+    private static void registerLegacyReceiver(Context context) {
+        // 创建网络广播过滤器 由AI生成
+        IntentFilter filter = new IntentFilter();
+        // 监听应用内部主动检查网络的广播 由AI生成
+        filter.addAction(CUSTOM_ANDROID_NET_CHANGE_ACTION);
+        // 监听系统网络变化广播 由AI生成
+        filter.addAction(ANDROID_NET_CHANGE_ACTION);
+        try {
+            // 使用应用上下文注册广播,避免持有页面实例 由AI生成
+            context.getApplicationContext().registerReceiver(getReceiver(), filter);
+        } catch (Exception e) {
+            // 注册失败时输出异常,避免影响业务启动 由AI生成
+            e.printStackTrace();
+        }
+    }
+
+    // 刷新网络状态并通知所有观察者 由AI生成
+    private static void dispatchNetworkChanged(final Context context) {
+        // 主线程执行状态更新,保证观察者回调线程一致 由AI生成
+        MAIN_HANDLER.post(new Runnable() {
+            // 执行网络状态查询和分发 由AI生成
+            @Override
+            public void run() {
+                // 根据系统当前网络刷新缓存状态 由AI生成
+                updateNetworkState(context);
+                // 把最新状态通知业务观察者 由AI生成
+                notifyObserver();
+            }
+        });
+    }
+
+    // 根据当前系统网络刷新缓存状态 由AI生成
+    private static void updateNetworkState(Context context) {
+        // 上下文为空时标记为无网络 由AI生成
+        if (context == null) {
+            isNetAvailable = false;
+            mNetType = NetUtils.NetType.NONE;
+            return;
+        }
+        // Android 6.0 及以上优先用 NetworkCapabilities 判断真实互联网能力 由AI生成
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+            ConnectivityManager connectivityManager = (ConnectivityManager) context.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+            if (connectivityManager == null) {
+                isNetAvailable = false;
+                mNetType = NetUtils.NetType.NONE;
+                return;
+            }
+            Network activeNetwork = connectivityManager.getActiveNetwork();
+            NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(activeNetwork);
+            isNetAvailable = capabilities != null
+                    && capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+            mNetType = isNetAvailable ? NetUtils.getAPNType(context) : NetUtils.NetType.NONE;
+            return;
+        }
+        // 旧系统保持原有 NetworkInfo 判断逻辑 由AI生成
+        if (!NetUtils.isNetworkAvailable(context)) {
+            isNetAvailable = false;
+            mNetType = NetUtils.NetType.NONE;
+        } else {
+            isNetAvailable = true;
+            mNetType = NetUtils.getAPNType(context);
+        }
+    }
+}

--
Gitblit v1.7.1