我有一个同时使用 ble 和 wifi 的 Android 应用程序。定期 ble 锁定并且不再检测设备。在查找锁定故障时,我注意到我可以通过关闭飞行/飞行模式来重新建立正常操作。但是,如果我打开/关闭蓝牙或打开/关闭 wifi,或者同时打开/关闭 wifi 和蓝牙,我无法复制通过打开/关闭飞行模式获得的结果。这告诉我飞行模式正在做一些不同的事情。所以:
飞行模式与打开和关闭蓝牙和/或 wifi 的单独功能有什么区别?
飞行模式禁用所有无线电、蜂窝、蓝牙、GPS、NFC、wimax 和任何其他声明的无线电,Settings.Global.AIRPLANE_MODE_RADIOS
您可以通过执行来检查特定设备中的列表adb shell settings get global airplane_mode_radios
。
至于为什么它与简单地禁用某些无线电不同,我也遇到过类似的情况,WIFI不再连接并在飞行模式开/关后再次工作。
您可以遵循APM 所做的源代码,但最终它会作为用户广播意图Intent.ACTION_AIRPLANE_MODE_CHANGED
,并且此意图由无线电的所有广播接收器单独处理。他们如何处理这与设置中的无线电的简单切换不同,这决定了它是否恢复生机。
例如,在 中BluetoothManagerService
,当我们启用飞行模式时,我们会触发2
收音机的状态,而不是0
禁用它。所以很明显disabled和飞机模式 disabled之间有区别,这很有趣。
// Bluetooth persisted setting is off
private static final int BLUETOOTH_OFF=0;
// Bluetooth persisted setting is on
// and Airplane mode won't affect Bluetooth state at start up
private static final int BLUETOOTH_ON_BLUETOOTH=1;
// Bluetooth persisted setting is on
// but Airplane mode will affect Bluetooth state at start up
// and Airplane mode will have higher priority.
private static final int BLUETOOTH_ON_AIRPLANE=2;
如您所见,在管理器的源代码中,注意到飞行模式会影响启动。所以也许这就是你所追求的。当我们在飞行模式后启用收音机时,运行的代码如下:
sendEnableMsg(mQuietEnableExternal);
然而,简单地启用无线电运行这个:sendEnableMsg(false);
也许它与安静模式有关?这很有趣,很抱歉我无法提供更好的答案,但希望这是一个很好的起点,如果你想更深入地挖掘的话。