翼京/ka 发表于 2014-8-27 17:15:36

Android 飞行模式切换

由麦可网整理,转载请注明出处


Android 飞行模式切换待机状态下,飞行模式切换流程分析:
  飞行模式切换比较复杂,它状态改变时涉及到极大模块状态切换:
  GSM模块,蓝牙模块,WIFI模块。
  飞行模式的enabler层会发送广播消息:ACTION_AIRPLANE_MODE_CHANGEDJava代码:

Java代码1      privatevoidsetAirplaneModeOn(booleanenabling){2      mCheckBoxPref.setEnabled(false);3      mCheckBoxPref.setSummary(enabling?R.string.airplane_mode_turning_on4      R.string.airplane_mode_turning_off);5         6      //Changethesystemsetting 7         8         9      Settings.System.putInt(mContext.getContentResolver(),Settings.System.AIRPLANE_MODE_ON,enabling?1:0);10   11   12    //Posttheintent 13   14   15    Intentintent=newIntent(Intent.ACTION_AIRPLANE_MODE_CHANGED);16    intent.putExtra("state",enabling);17    mContext.sendBroadcast(intent);18    }因为GSM ,蓝牙,wifi模块分别注册了对ACTION_AIRPLANE_MODE_CHANGED 消息的监测,所以收到
  该消息后,模块会进行切换。
  BluetoothDeviceService.java
  开启蓝牙:enable(false);
  关闭蓝牙:disable(false);  PhoneApp.java(packages\apps\phone\src\com\Android\phone)
  设置GSM模块状态 phone.setRadioPower(enabled);
  WifiService.java
  设置 wifi 状态setWifiEnabledBlocking(wifiEnabled, false, Process.myUid());
  
  GSM模块切换过程分析:
  phone.setRadioPower(enabled)调用的是:
  文件GSMPhone.java 中的的函数:
  public voidsetRadioPower(boolean power)
  mSST.setRadioPower(power);
  因为有ServiceStateTracker mSST;
  mSST.setRadioPower调用的是文件ServiceStateTracker.java 中的函数:
  public voidsetRadioPower(boolean power)
  mDesiredPowerState= power;
  setPowerStateToDesired();
  cm.setRadioPower(true,null);
  或者
  cm.setRadioPower(false,null);
  因为有:
  CommandsInterfacecm;
  public finalclass RIL extends BaseCommands implements CommandsInterface
  所以cm.setRadioPower 调用的是文件RIL.java 中的函数:
  public voidsetRadioPower(boolean on, Message result)
  RILRequestrr = RILRequest.obtain(RIL_REQUEST_RADIO_POWER, result);
  rr.mp.writeInt(1);
  ...
  send(rr)
  通过 send 向 rild 发送 RIL_REQUEST_RADIO_POWER 请求来开启或者关闭GSM模块。
  rild 数据接收流程:
  收到 RIL_REQUEST_RADIO_POWER执行:
  requestRadioPower(data,datalen, t);
  然后根据条件往无线模块发送模块开启和关闭请求
  主要的at命令有:
  err =at_send_command("AT+CFUN=0", &p_response);
  err =at_send_command("AT+CFUN=1", &p_response);
  
  蓝牙模块切换过程分析:
  enable(false);
  蓝牙开启调用文件BluetoothDeviceService.java 中的函数:
  publicsynchronized boolean enable(boolean saveSetting)
  setBluetoothState(BluetoothDevice.BLUETOOTH_STATE_TURNING_ON);
  mEnableThread= new EnableThread(saveSetting);
  mEnableThread.start();
  
  disable(false)
  蓝牙关闭调用文件 中的函数:
  publicsynchronized boolean disable(boolean saveSetting)
  setBluetoothState(BluetoothDevice.BLUETOOTH_STATE_TURNING_OFF);
  
  wifi模块切换过程分析:
  广播 wifi 状态改变的消息:WIFI_STATE_CHANGED_ACTION
  setWifiEnabledState(enable? WIFI_STATE_ENABLING : WIFI_STATE_DISABLING, uid);  更新 wifi 状态:
  private voidupdateWifiState()  如果需要使能开启 wifi 那么会发送:
  sendEnableMessage(true,false, mLastEnableUid);
  sendStartMessage(strongestLockMode== WifiManager.WIFI_MODE_SCAN_ONLY);
  mWifiHandler.sendEmptyMessage(MESSAGE_STOP_WIFI);  消息循环中处理命令消息:
  public voidhandleMessage(Message msg)
  如果使能wifi:setWifiEnabledBlocking(true,msg.arg1 == 1, msg.arg2);
  开启wifi:mWifiStateTracker.setScanOnlyMode(msg.arg1 != 0);
  setWifiEnabledBlocking(false,msg.arg1 == 1, msg.arg2);
  断开 mWifiStateTracker.disconnectAndStop();  开启过程步骤:
  1> 装载 wifi 驱动: WifiNative.loadDriver()
  2> 启动后退 daemo supplicant: WifiNative.startSupplicant()  关闭过程步骤:
  1> 停止后退 daemo supplicant:WifiNative.stopSupplicant()
  2> 卸载 wifi 驱动: WifiNative.unloadDriver()
  如果 wifi 状态默认为开启那么 WifiService 服务的构造函数:
  WifiService(Contextcontext, WifiStateTracker tracker)
  booleanwifiEnabled = getPersistedWifiEnabled();
  setWifiEnabledBlocking(wifiEnabled,false, Process.myUid());
  会开启wifi模块。





chuang 发表于 2014-8-28 09:22:21

厉害,学习了

yanggis 发表于 2014-8-28 10:36:54

有什么用?你还准备带你的Cubieboard去飞机上飞一下?就是你能带上飞机,你怎么供电呢?电都供不了,你还设置毛的飞行模式啊。

zq9610 发表于 2015-1-20 00:05:23

yanggis 发表于 2014-8-28 10:36 static/image/common/back.gif
有什么用?你还准备带你的Cubieboard去飞机上飞一下?就是你能带上飞机,你怎么供电呢?电都供不了,你还设 ...

飞机上可以用电脑,也可用移动电源

yanggis 发表于 2015-2-4 12:30:51

本帖最后由 yanggis 于 2015-2-4 12:32 编辑

zq9610 发表于 2015-1-20 00:05 static/image/common/back.gif
飞机上可以用电脑,也可用移动电源
那你用什么来显示呢?再搞个显示器带着?再搞个网线,交换机之类的?你以为飞机是你自己的实验室啊?突然一个速降让你和你的CT一起飞上去你就爽了……。

页: [1]
查看完整版本: Android 飞行模式切换