安卓的飞行模式

news/2024/11/7 19:22:56/

在“设置”->“无线和网络”,有一项飞行模式的checkbox。根据其描述“禁用所有无线连接”,可略知其功能,但具体实现了哪些功能呢,我们从代码的角度来分析。
在类WirelessSettings中,包含一个成员变量mAirplaneModeEnabler,飞行模式的功能是由类AirplaneModeEnabler来实现的。setAirplaneModeOn(boolean enabling)是该类用来设置飞行模式开关的方法,该方法最重要的实现是广播Intent.ACTION_AIRPLANE_MODE_CHANGED,并携带开/关的标志位。

Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);
intent.putExtra("state", enabling);
mContext.sendBroadcast(intent);

查找源代码,有3个模块响应该事件。

  1. PhoneApp:关闭电话射频信号
  2. WifiService:关闭wifi信号
  3. BluetoothService:关闭bluetooth信号
    但wifi模块稍有区别,即使在飞行模式下,wifi也可以开启。

飞行模式设置入口,下拉状态栏,点击飞行模式图标,我们就从这里看起,其他入口逻辑差不多。这个源码位于
frameworks\base\packages\SystemUI\src\com\android\systemui\qs\tiles\AirplaneModeTile.java

public void handleClick() {MetricsLogger.action(mContext, getMetricsCategory(), !mState.value);setEnabled(!mState.value);mEnable.setAllowAnimation(true);mDisable.setAllowAnimation(true);}private void setEnabled(boolean enabled) {final ConnectivityManager mgr =(ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);mgr.setAirplaneMode(enabled);}

接下来调用 ConnectivityManager#setAirplaneMode 方法。
位于 frameworks/base/core/java/android/net/ConnectivityManager.java

public void setAirplaneMode(boolean enable) {try {mService.setAirplaneMode(enable);} catch (RemoteException e) {}}

mService 是 IConnectivityManager,是个接口,其实现看
ConnectivityService#setAirplaneMode,位于frameworks/base/services/core/java/com/android/server

public class ConnectivityService extends IConnectivityManager.Stubimplements PendingIntent.OnFinished {private static final String TAG = "ConnectivityService";private static final boolean DBG = true;private static final boolean VDBG = false;private static final boolean LOGD_RULES = false;... public void setAirplaneMode(boolean enable) {enforceConnectivityInternalPermission();final long ident = Binder.clearCallingIdentity();try {final ContentResolver cr = mContext.getContentResolver();Settings.Global.putInt(cr, Settings.Global.AIRPLANE_MODE_ON, enable ? 1 : 0);Intent intent = new Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED);intent.putExtra("state", enable);mContext.sendBroadcastAsUser(intent, UserHandle.ALL);} finally {Binder.restoreCallingIdentity(ident);}}
}

这里设置了飞行模式状态的系统变量以及发送 ACTION_AIRPLANE_MODE_CHANGED 系统广播,接下来看看该广播的接受。经过查找,ACTION_AIRPLANE_MODE_CHANGED 广播接受有好几次,而手机开启或关闭飞行模式时,主要是开启或关闭 Radio 无线通信,其处理逻辑在 PhoneGlobals 类中。另外 WiFi 、蜂窝数据和蓝牙处理都能相应追踪到。


http://www.ppmy.cn/news/644157.html

相关文章

问题:笔记本只剩下飞行模式了

问题:早上醒来发现笔记本(戴尔,win10)只剩下飞行模式了,WLAN还有移动热点模块不翼而飞。 在此之后,尝试了几个方法:(1)网络重置;(2)服务中开启WLAN AutoConfig的自动开启…

win10笔记本打开只有飞行模式的解决方法

方法一: 1、按下“winr”打开运行,输入“regedit”,依次展开到“HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesNdisuio”,查看其“DisplayName”键值是“NDISUsermode I/O Protocol”如缺损,可新建; 2、在右边…

笔记本wifi只剩下飞行模式

笔记本win10的wifi功能消失只剩下飞行模式 点击网络和Internet设置,然后选择状态,然后重置等待重启即可,之前不会解决都是重做系统感觉亏大了

手机的飞行模式

手机的飞行模式又叫航空模式,是在乘坐飞机时必须关掉手机,以免手机信号的发射和接受对飞机飞行造成影响 ,有某些手机里就自带了这个功能,可以关闭掉SIM卡的信号收发装置。 还有就是通过一些软件来实现的,如 S60软件里的…

自定义飞行模式

添加自定义模式 本文主要参考APM官网 (https://ardupilot.org/dev/docs/apmcopter-adding-a-new-flight-mode.html) 以及怒飞垂云的博客 (http://www.nufeichuiyun.com/?p277) APM的代码量非常大,想要完全搞明白不太可能,快速入门的方法就是仿照着大牛…

计算机连接网络是飞行模式怎么办,电脑wifi界面只有飞行模式怎么办

大家有没有遇到过电脑用得好好的突然之间就没有了WiFi网络了,导致工作和游戏都完成不了,打开WiFi网络界面发现什么都没有了,只有一个飞行模式,即使重启也无法修复。在网上查找多种方法后,发现修改注册表可以修复了&…

“飞行模式”与“离线模式”

“飞行模式”变“离线模式” 2010-03-25 04:43:00 来源: 华商网-华商报(陕西西安) 不久前,国内某航班上一位乘客由于使用手机“飞行模式”玩游戏,结果被罚了2000元,此事引发手机用户对“飞行模式”的重新关注。 厂商对策 “飞行模式”因误导…