Java 广播接收器多久更新一次wifi扫描?

Java 广播接收器多久更新一次wifi扫描?,java,android,Java,Android,目标:定期获取wifi扫描结果(我可以选择时间段) 问题:我正在尝试获取wifi扫描结果。我正在使用这段代码。 从我使用SCAN\u RESULTS\u AVAILABLE\u ACTION常量注册接收器时的理解来看,我的意思是:“当接入点扫描结果广播可用时,通知我” 我搜索了一下,发现startScan()就是我一直在寻找的方法,但不幸的是 公共布尔起始扫描() 此方法在API级别28中被弃用。 在未来的版本中,应用程序触发扫描请求的功能将被删除 问题:是否有一种方法可以替代startScan

目标:定期获取wifi扫描结果(我可以选择时间段)

问题:我正在尝试获取wifi扫描结果。我正在使用这段代码。 从我使用
SCAN\u RESULTS\u AVAILABLE\u ACTION
常量注册接收器时的理解来看,我的意思是:“当接入点扫描结果广播可用时,通知我”

我搜索了一下,发现
startScan()
就是我一直在寻找的方法,但不幸的是

公共布尔起始扫描()

此方法在API级别28中被弃用。 在未来的版本中,应用程序触发扫描请求的功能将被删除

问题:是否有一种方法可以替代
startScan()
或其他方法在需要时触发扫描? 我如何知道wifi扫描更新的频率

 wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);

        // Check if wifi is enabled. Enables it otherwise.
        if (!wifiManager.isWifiEnabled()) {
            //Toast.makeText(getApplicationContext(), "WiFi is disabled. Let's enable it.", Toast.LENGTH_SHORT).show();
            // CHANGE_WIFI_STATE permission allow this
            wifiManager.setWifiEnabled(true);
        }

        wifiScanReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {

                localMaxSignalStrength = 1;
                results = wifiManager.getScanResults();

                for (int i = 0; i < results.size(); i++) {

                    ScanResult el = results.get(i);
                    int signalLevel = wifiManager.calculateSignalLevel(el.level, 5);

                    if (signalLevel > localMaxSignalStrength){
                        localMaxSignalStrength = signalLevel;
                    }

                    Toast.makeText(getApplicationContext(), "SSID:" + el.SSID + "frequency" + el.frequency + "lev:" + signalLevel, Toast.LENGTH_SHORT).show();
                }
                unregisterReceiver(this);

            }
        };

        registerReceiver(wifiScanReceiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
wifiManager=(wifiManager)getApplicationContext().getSystemService(Context.WIFI_服务);
//检查wifi是否已启用。以其他方式启用它。
如果(!wifiManager.isWifiEnabled()){
//Toast.makeText(getApplicationContext(),“WiFi已禁用。让我们启用它。”,Toast.LENGTH_SHORT).show();
//更改\u WIFI\u状态权限允许此操作
wifiManager.setWifiEnabled(true);
}
wifiScanReceiver=新广播接收器(){
@凌驾
公共void onReceive(上下文、意图){
localMaxSignalStrength=1;
results=wifiManager.getScanResults();
对于(int i=0;i本地最大信号强度){
localMaxSignalStrength=信号电平;
}
Toast.makeText(getApplicationContext(),“SSID:+el.SSID+“frequency”+el.frequency+“lev:+signalLevel,Toast.LENGTH_SHORT).show();
}
未注册接收人(本);
}
};
registerReceiver(wifiScanReceiver,新的IntentFilter(WifiManager.SCAN\u RESULTS\u AVAILABLE\u ACTION));
编辑1

通过更好地阅读有关广播接收器的文档,我发现如果您不调用unregister Receiver,您将继续接收您注册的广播消息

要停止接收广播,请拨打 unregisterReceiver(android.content.BroadcastReceiver)。一定要 当不再需要接收器或上下文不可用时,取消注册接收器 不再有效

我试图取消注释
取消注册接收者(此)
现在我似乎继续收到Wifi扫描结果

编辑2(2018年9月)

我上面写的,尤其是我不断地收到扫描结果的事实,对于Android 4.2.2(JellyBean)来说是正确的。自从我在安卓7.0(Nougat)上进行测试以来,我注意到(没有注销接收器),我没有像以前的操作系统版本那样连续接收wifi扫描结果,但速度非常慢(扫描间隔几分钟)

在这种情况下,我被迫使用
WifiManager
startScan()
方法(注意:在API 28中已弃用)。无论如何,该方法有一些限制,如下所述

以下限制适用于使用 WifiManager.startScan()

安卓8.0和安卓8.1:

每个后台应用程序可以在30分钟内扫描一次

Android 9及更高版本:

每个前台应用程序可以在2分钟内扫描4次。这 允许在短时间内进行突发扫描

所有后台应用程序可以在30分钟内扫描一次


那么,在android Pie中启动扫描的最佳方式是什么???