今天中午午休的时候,我把手机调成了飞行模式。看得出WiFi,蜂窝数据,蓝牙都关了。我想,这个时候还能收到短信吗?出于好奇,我们不妨研究一下源代码,看看在点击飞行模式下会发生什么。
基于Android 9.0的源代码分析。
飞机模式平铺#手柄单击
设置飞行模式入口,下拉状态栏,点击飞行模式图标。从这里,其他入口的逻辑也差不多。源代码位于aosp/framework/base/packages/systemui/src/com/Android/systemui/QS/tiles/AirPlane modetile . Java直接观看其点击事件。
public class airplane modetileextendqstileimpl & lt;BooleanState & gt{
//省略其他代码
@覆盖
publicvoidhandleClick单击{
booleanaaplanemodenabled = mstate . value;
metriccslogger . action(mccontext,getMetricsCategory,!airlanmodeenabled);
if(!airplaneModeEnabled & amp& ampBoolean.parseBoolean(
system properties . get(TelephonyProperties。PROPERTY_INECM_MODE))) {
dependency . get(ActivityStarter . class)。post startactivitydismissingkeyguard(
新意图(电话会议帐篷。ACTION _ SHOW _ NOTICE _ ECM _ BLOCK _ OTHERS),0);
返回;
}
setEnabled(!airlanmodeenabled);
}
private void setenabled(booleaenabled){
finalConnectivityManager mgr =
(ConnectivityManager)McContext . GetSystemServiCe(上下文。CONNECTIVITY _ SERVICE);
mgr.setAirplaneMode(已启用);
}
//省略其他代码
}
然后调用connectivitymanager # setairplane mode方法。
ConnectivityManager #设置飞机模式
AOSP/框架/基础/核心/Java/Android/net/connectivitymanager . Java
@ required session(any of = {
安卓。manifest . permission . Network _ SETTINGS,
安卓。manifest . permission . network _ SEtuP _ WIZARD,
安卓。manifest . permission . network _ STACK })
@SystemApi
publicationvoitsetairplane mode(booleaenable){
尝试{
mService.setAirplaneMode(启用);
} catch(RemoteException e) {
throwe.rethrowFromSystemServer
}
}
MService是IConnectivityManager,是一个接口。它的实现依赖于connectionservice # setairplane mode。
ConnectivityService # setairplane mode
/AOSP/框架/基础/服务/核心/Java/com/Android/服务器
@覆盖
publicationvoitsetairplane mode(booleaenable){
强制网络设置或设置;
final longient = binder . clearcallingidentity;
尝试{
financicontentresolver Cr = McContext . GetContentresolver;
设置。Global.putInt(cr,Settings。全局。飞机_模式_开,编码(启用));
意向=新意向(意向。ACTION _ FAMILY _ MODE _ CHANGED);
intent.putExtra( "state ",enable);
mcontext . SendBroadcastasuser(intent,UserHandle。ALL);
}最后{
binder . restore callingIdentity(ident);
}
}
在这里,设置飞行模式状态的系统变量,并发送动作_飞机_模式_已更改系统广播。接下来看播出的接受度。搜索后,ACTION _ FAMILY _ MODE _ CHANGED广播被多次接受,当飞机模式打开或关闭时,无线电无线通信主要打开或关闭,其处理逻辑在PhoneGlobals类中。此外,可以相应地跟踪WiFi、蜂窝数据和蓝牙处理。
补充:什么是电台?无线电是无线通信模块的驱动程序,负责网络通信。
电话全球
AOSP/套餐/服务/电话/src/com/Android/phone/phone globals . Java
publicClassPhoneGlobalSexTendScontextwrapper {
//省略其他代码
privatedinvhandleairlanemodechange(上下文上下文,intnewMode){
intcellState =设置。global . GetInt(context . GetContentResolver,
设置。全局。CELL_ON,PhoneConstants。CELL _ ON _ FLAG);
booleanisairplaneNewlyon =(new mode = = 1);
开关(cellState) {
casePhoneConstants。单元格_关闭_标志:
//如果用户
//已关闭。
打破;
casePhoneConstants。单元格_开_标志:
mebeturnchelloff(context,isairplanenlyon);
打破;
casePhoneConstants。电池_关闭_到期_飞机_模式_标志:
mebeturncellon(context,isairplanenlyon);
打破;
}
}
/*
*如果进入飞机模式时必须关闭收音机,则返回真。
*/
privatebooleanischelloffiairplane模式(上下文上下文上下文){
字符串airplaneModeRadios =设置。global . GetString(context . GetContentResolver,
设置。global . AIRPORT _ MODE _ RATIONS);
returnairplaneModeRadios = = null
|| airplaneModeRadios.contains(设置。global . RAdio _ CELL);
}
privatevoidsetRadioPowerOff(上下文上下文上下文){
Log.i(LOG_TAG,“关闭飞机无线电”);
设置。global . putint(context . getcontentresolver,Settings。全局。CELL_ON,
PhoneConstants。CELL _ OFF _ DUE _ TO _ FAMILY _ MODE _ FLAG);
systemproperties . set(" persist . radio . airline _ mode _ on "," 1 ");
设置。global . putint(getContentResolver,Settings。global . ENABLE _ CELL _ ON _ BOOT,0);
phonetutils . SetRadiower(false);
}
privatevoidsetRadioPowerOn(上下文上下文上下文){
Log.i(LOG_TAG,“在飞机上打开无线电”);
设置。global . putint(context . getcontentresolver,Settings。全局。CELL_ON,
PhoneConstants。CELL _ ON _ FLAG);
设置。global . putint(getContentResolver,Settings。全局。启用_蜂窝_开机_启动,
1);
systemproperties . set(" persist . radio . airline _ mode _ on "," 0 ");
phonetutils . SetRadiower(true);
}
privatevoidmaybeTurnCellOff(上下文上下文,booleanisAirplaneNewlyOn){
if(isAirplaneNewlyOn) {
//如果我们试图关闭收音机,请确保没有激活的
//紧急电话。如果有,将飞机模式切换回关闭。
TelecomManager TM =(TelecomManager)context . GetSystemServiCe(TELECOM _ ServiCe);
if(tm!= null & amp& ampTM . IsinergencyCall){
//将飞机模式切换回关闭状态。
ConnectivityManager.from( this)。setAirPlaneMode(false);
吐司. makeText(这个,r . string . radio _ off _ during _ emergency _ call,吐司。长度_长)
。显示;
Log.i(LOG_TAG,“忽略飞机模式:紧急呼叫。关闭飞机”);
} else if(IsCelloffiairPlaneMode(context)){
setRadioPowerOff(上下文);
} else{
Log.i(LOG_TAG,“忽略飞机模式:设置阻止手机无线电关机”);
}
}
}
privatevoidmaybeTurnCellOn(上下文上下文,booleanisAirplaneNewlyOn){
if(!isAirplaneNewlyOn) {
setRadioPowerOn(上下文);
}
}
/**
*手机应用程序关心的杂项意图广播接收器。
*/
privateClassPhoneappBroadcastReceiveRexTendsBroadcastReceiver {
@覆盖
publicvoidonReceive(上下文上下文,意图意图){
String action = intent.getAction
if(action.equals(Intent .动作_飞机_模式_已更改){
在飞机模式=设置。global . GetInt(GetContentResolver,
设置。全局.飞机_模式_开,飞机_关);
//将任何非关值视为开。
if(飞机模式!=飞机_关闭){
飞机模式=飞机_开;
}
handleAirplaneModeChange(上下文,Airlanemode);
}//省略其他代码
}
}
//省略其他代码
}
PhoneUtils.setRadioPower会继续调用GsmCdmaPhone # setRadioPower,调用mSST.setRadioPower,最后mSST对象会向RIL对象发送关闭或打开Radio无线通信模块的请求,这里就不细看了,不过有兴趣可以继续关注。这里说的是“安卓点击飞行模式会怎么样?”大致了解了过程,就结束了。
1.《airplane Android 当点击飞行模式都发生了什么?》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。
2.《airplane Android 当点击飞行模式都发生了什么?》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/guonei/1065324.html