【问题标题】:Internet connectivity and Broadcast Receiver互联网连接和广播接收器
【发布时间】:2018-10-24 21:04:07
【问题描述】:

我正在开发需要检查互联网连接是否稳定的应用程序。如果 Internet 连接不稳定,那么我们需要调用我们的 Web 服务,否则我们将无法访问。

为此,我在 Java 中编写了以下广播接收器,因为我读到 android 现在希望开发人员在 Java 类中注册此接收器。

原来是这样

private class NetworkChangeBroadcastReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {


           callMyWebService();


    }


 @Override
    protected void onResume() {
        super.onResume();


        if (!isNetworkBroadcastReceiverRegistered) {
            if (NetworkChangeBR == null) {
                NetworkChangeBR = new NetworkChangeBroadcastReceiver();
                registerReceiver(NetworkChangeBR, new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION));
                isNetworkBroadcastReceiverRegistered = true;
            }
        }

        acquireWakeLock(mCustomSharedPreferences.getBoolean(CustomSharedPreferences.KEEP_SCREEN_ON_ALL_THE_TIME, false));

    }

    @Override
protected void onPause() {
    super.onPause();
    if (isNetworkBroadcastReceiverRegistered) {
        unregisterReceiver(NetworkChangeBR);
        NetworkChangeBR = null;
        isNetworkBroadcastReceiverRegistered = false;
    }
}

问题: 但我面临以下问题

  • 当我第一次在我的 onResume 方法中注册接收器时,它会自动触发,作为回报,它会调用我的 web 服务,因为实际上没有发生互联网变化
  • 第二,这只是检查无线连接和断开连接,但我想在无线最终连接到互联网时获得回调,并且当它发生时,广播必须向我的应用程序抛出回调

请在这两种情况下帮助我。

【问题讨论】:

    标签: java android broadcastreceiver android-broadcastreceiver


    【解决方案1】:

    之所以会立即触发您的BroadcastReceiver,是因为广播IntentConnectivityManager.CONNECTIVITY_ACTION是“粘性”广播。这允许应用程序注册并立即接收此类型的最后一个广播事件(以便它们可以确定当前的连接情况)。如果这个“粘性”广播给您带来了问题,只需在 onReceive() 中检查并忽略它:

    // Ignore the sticky broadcast of the initial state
    if (isInitialStickyBroadcast()) {
        return;
    }
    

    在您的BroadcastReceiver 获得的Intent 中有很多数据作为“附加”传递。例如,您可以判断事件是 CONNECT 还是 DISCONNECT 事件等。查看ConnectivityManager 上的文档以确定发送了哪些“附加”以及如何使用它们。

    【讨论】:

    • 什么是InitialStickyBroadcast
    • “粘性”广播是在为该广播注册的BroadcastReceivers 都被触发后留在系统中的广播。这允许系统保留某种类型的“最后发送的广播”。这用于记录某物的当前状态(例如:连接、飞行模式、电池电量、信号强度),以便应用可以注册以接收更改,并立即接收包含“当前状态”的广播Intent
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多