今天中午午休时,我把手机开飞行模式了,能看到 WiFi 、蜂窝数据和蓝牙都关闭了,心想,这时候还能收到短信吗?顺着好奇心,我们不妨来研究一下源码,看看点击飞行模式都发生了什么?
基于 Android 9.0 源码分析。
AirplaneModeTile#handleClick
飞行模式设置入口,下拉状态栏,点击飞行模式图标,我们就从这里看起,其他入口逻辑差不多。这个源码位于AOSP/frameworks/base/packages/SystemUI/src/com/android/systemui/qs/tiles/AirplaneModeTile.java
直接看其点击事件。
接下来调用 ConnectivityManager#setAirplaneMode 方法。
ConnectivityManager#setAirplaneMode
AOSP/frameworks/base/core/java/android/net/ConnectivityManager.java
|
|
mService 是 IConnectivityManager,是个接口,其实现看 ConnectivityService#setAirplaneMode。
ConnectivityService#setAirplaneMode
/AOSP/frameworks/base/services/core/java/com/android/server
|
|
这里设置了飞行模式状态的系统变量以及发送 ACTION_AIRPLANE_MODE_CHANGED 系统广播,接下来看看该广播的接受。经过查找,ACTION_AIRPLANE_MODE_CHANGED 广播接受有好几次,,而手机开启或关闭飞行模式时,主要是开启或关闭 Radio 无线通信,其处理逻辑在 PhoneGlobals 类中。另外 WiFi 、蜂窝数据和蓝牙处理都能相应追踪到。
补充:什么是 Radio?Radio 是无线通信模块的驱动程序,负责网络通信。
PhoneGlobals
AOSP/packages/services/Telephony/src/com/android/phone/PhoneGlobals.java
|
|
PhoneUtils.setRadioPower 会继续调用 GsmCdmaPhone#setRadioPower,调用 mSST.setRadioPower,最终由 mSST 对象向 RIL 对象发起关闭或开启 Radio 无线通信模块的请求,这里就不细看了,有兴趣可以自己继续跟下去。到这里我们就对“Android 当点击飞行模式都发生了什么?”流程有了大致了解,就酱紫,Over。