【问题标题】:WifiManager.NETWORK_STATE_CHANGED_ACTION triggers every timeWifiManager.NETWORK_STATE_CHANGED_ACTION 每次触发
【发布时间】:2017-03-21 14:59:39
【问题描述】:

我的Fragment 中有这个BroadcastReceiver 实现:

private BroadcastReceiver receiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
                NetworkInfo networkInfo =
                        intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                    if(networkInfo.isConnected()) {
                         //do stuff
                    }
                    //Other actions implementation
            } 
       }
};

使用标准注册/注销方法:

    @Override
    public void onStart() {
        super.onStart();
        getActivity().registerReceiver(receiver, getIntentFilter());
    }

    @Override
    public void onStop() {
        super.onStop();
        getActivity().unregisterReceiver(receiver); 
    }

在其他Fragment 中与WifiManager.NETWORK_STATE_CHANGED_ACTION 具有相同实现的接收器

问题:每次启动其中一个片段时都会触发此操作,但我需要它仅在 Wifi 刚刚连接时触发,并且作为操作的名称说WifiManager.NETWORK_STATE_CHANGED_ACTION,所以它应该只在Wifi状态改变

时工作

编辑:正如回复的那样,这个动作默认每次都会触发,所以我的问题是:Wifi连接没有动作?

【问题讨论】:

  • 我认为更好的选择是在 Activity 中只拥有一个 BroadcastReceiver,并在发生连接状态更改时调用当前活动的 Fragment 中的方法。

标签: android broadcastreceiver wifimanager


【解决方案1】:

这就是您注册 NETWORK_STATE_CHANGED_ACTION 时 WifiManager 的工作方式。当您注册它时,您将立即获得 1 个更新,以显示当前状态。

为了避免这种情况,您可以在片段中设置一个简单的布尔值,将其默认设置为“真”。在您的广播接收器中,检查这是否为真,如果是,这是您第一次获得更新,将其设置为假,然后简单地忽略更新。下次调用时,布尔值将为真,您可以使用数据。

    private boolean firstTime = true;

    private BroadcastReceiver receiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                if(firstTime) {
                    firstTime = false;
                    return;
                }

                if(intent.getAction().equals(WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
                    NetworkInfo networkInfo =
                            intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
                        if(networkInfo.isConnected()) {
                             //do stuff
                        }
                        //Other actions implementation
                } 
           }
    };

【讨论】:

  • 我做不到,因为我在两个片段之间切换,并且每次都会重新创建其中的一个。所以 Wifi 连接 没有任何动作?
【解决方案2】:

NETWORK_STATE_CHANGED_ACTION 广播可能是“粘性”的,使用 isInitialStickyBroadcast 方法检查该广播是否是第一个“粘性”的广播:

@Override
public void onReceive (Context context, Intent intent) {
  if (!isInitialStickyBroadcast()) {
    // Only check updates in state
  }
}

【讨论】:

    【解决方案3】:

    "ConnectivityManager.NetworkCallback"。这仅在 API 21 及更高版本中可用。这可能没有您所追求的确切条件,但很接近。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2012-08-22
      • 2018-12-16
      • 1970-01-01
      • 2018-08-09
      相关资源
      最近更新 更多