【问题标题】:Can LocalBroadcastManager detect WifiManager.NETWORK_STATE_CHANGED_ACTION changes?LocalBroadcastManager 可以检测到 WifiManager.NETWORK_STATE_CHANGED_ACTION 的变化吗?
【发布时间】:2025-12-03 19:35:01
【问题描述】:

我想使用 BroadcastReceiver 将任何 Wifi 连接更改通知我的 Activity。由于此广播在应用程序中,因此我尝试使用更高效的 LocalBroadcastManager 对象。

但是,无论我做什么,BroadcastReceiver.onReceive() 方法都不会触发。我可能连接不正确,或者我正在监听的 WifiManager.NETWORK_STATE_CHANGED_ACTION 操作无法针对 LocalBroadcastManager 注册?任何帮助或澄清将不胜感激。

这是我的 Activity 类的示例,其中包含所有逻辑。

public class MyActivity extends ActionBarActivity {

private BroadcastReceiver wifiReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))
        {
            // Do something
        }
    }
};

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_my);

    IntentFilter wifiStatusIntentFilter = new IntentFilter();
    wifiStatusIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    wifiStatusIntentFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
    LocalBroadcastManager.getInstance(this).registerReceiver(wifiReceiver, wifiStatusIntentFilter);
}

protected void onPause() {
    super.onPause();
    LocalBroadcastManager.getInstance(this).unregisterReceiver(wifiReceiver);
}

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

    IntentFilter wifiStatusIntentFilter = new IntentFilter();
    wifiStatusIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
    LocalBroadcastManager.getInstance(this).registerReceiver(wifiReceiver, wifiStatusIntentFilter);
}

}

当我打开和关闭手机上的 wifi,或者进入和离开 wifi 范围时,onReceive() 方法永远不会被触发。

【问题讨论】:

    标签: android android-intent wifimanager localbroadcastmanager


    【解决方案1】:

    您无法通过 LocalBroadcastManager 接收 WifiManager.NETWORK_STATE_CHANGED_ACTION。 LocalBroadcastManager 仅在您的进程中起作用。

    帮助注册并向本地对象发送 Intent 广播 在你的过程中。与发送相比,这具有许多优点 使用 sendBroadcast(Intent) 进行全球广播:

    • 您知道您正在广播的数据不会离开您的应用程序,因此不必担心泄露私人数据。
    • 其他应用程序无法将这些广播发送到您的应用程序,因此您无需担心存在安全漏洞 他们可以利用。
    • 比通过系统发送全球广播更高效。

    你应该使用上下文的 registerReceiver

    【讨论】:

      【解决方案2】:

      由于此广播在应用程序中,因此我尝试使用更高效的 LocalBroadcastManager 对象。

      这只适用于通过LocalBroadcastManager发送的广播。它不适用于系统广播,尤其是其他进程发送的广播。

      也许我正在监听的 WifiManager.NETWORK_STATE_CHANGED_ACTION 操作无法针对 LocalBroadcastManager 注册?

      正确。

      【讨论】:

        最近更新 更多