当应用从后台返回时,省电模式不会导致网络连接

por*_*der 7 networking android broadcastreceiver

我使用观察者模式来监视网络连接何时发生变化.我遇到的问题是,如果在任何设备上启用了省电模式,则在检查连接时,从后台返回到我的应用程序的前台将立即触发"无网络".由于观察者模式的性质,此更改将显示我的无连接对话框,即使毫秒后恢复连接.

从后台返回应用程序时连接信号仍然很强,但出于某种原因,省电模式会让系统认为没有连接.我该如何控制?如果省电模式处于活动状态,是否有某种方法可以忽略检查连接?

这是我的网络观察者类.我在我的应用程序中注册接收器,并利用应用程序的活动生命周期来确定何时应该监听网络中的更改以及何时不应该.提前致谢!

public class NetworkReceiver extends BroadcastReceiver {
    private static final String TAG = NetworkReceiver.class.getSimpleName();

    private static final List<NetworkStatusObserver> mObserverList = new ArrayList<>();
    private static boolean isNetworkConnected = true;

    @Override
    public void onReceive(Context context, Intent intent) {
        Logger.i(TAG, "onReceive() broadcast");
        boolean disconnected = intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false);
        boolean isNetworkConnectedCurrent;

        if (disconnected) {
            isNetworkConnectedCurrent = false;
        } else {
            NetworkInfo networkInfo;

            if (Build.VERSION.SDK_INT < 17) {
                networkInfo = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);
            } else {
                ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
                networkInfo = cm.getActiveNetworkInfo();
            }

            isNetworkConnectedCurrent = !FrameworkUtils.checkIfNull(networkInfo) && networkInfo.isConnectedOrConnecting();
        }

        if (isNetworkConnectedCurrent != isNetworkConnected) {
            isNetworkConnected = isNetworkConnectedCurrent;
            Logger.d(TAG, "NetworkStatus.onReceive - isNetworkConnected: " + isNetworkConnected);
            notifyObservers(isNetworkConnected);
        }
    }

    /**
     * Lets all {@link NetworkStatusObserver}s know if the DEVICE is connected to a network.
     *
     * @param isNetworkConnectedCurrent
     */
    private void notifyObservers(Boolean isNetworkConnectedCurrent) {
        for (NetworkStatusObserver networkStatusObserver : mObserverList) {
            networkStatusObserver.notifyConnectionChange(isNetworkConnectedCurrent);
        }
    }

    /**
     * Add observer to observer list
     *
     * @param observer
     */
    public void addObserver(NetworkStatusObserver observer) {
        mObserverList.add(observer);
    }

    /**
     * Remove observer from observer list
     *
     * @param observer
     */
    public void removeObserver(NetworkStatusObserver observer) {
        mObserverList.remove(observer);
    }

    /**
     * Retrieve observer list size
     *
     * @return
     */
    public int getObserverSize() {
        return mObserverList.size();
    }

    /**
     * Check if receiver is added to observer list
     *
     * @param observer
     * @return
     */
    public boolean contains(NetworkStatusObserver observer) {
        return mObserverList.contains(observer);
    }

    /**
     * Method is used to print observer list
     */
    public void printObserverList() {
        Logger.i(TAG, "===== PRINT OBSERVER LIST ===== ");
        for (int i = 0; i < mObserverList.size(); i++) {
            Logger.i(TAG, String.format("item(%d): %s", i, mObserverList.get(i).toString()));
        }
    }

    /**
     * Interface for monitoring network status change
     */
    public interface NetworkStatusObserver {
        void notifyConnectionChange(boolean isConnected);
    }
}
Run Code Online (Sandbox Code Playgroud)