CubieBoard中文论坛

 找回密码
 立即注册
搜索
热搜: unable
查看: 6709|回复: 4

Android 飞行模式切换

[复制链接]
发表于 2014-8-27 17:15:36 | 显示全部楼层 |阅读模式
由麦可网整理,转载请注明出处



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

Java代码
1        privatevoidsetAirplaneModeOn(booleanenabling){
2        mCheckBoxPref.setEnabled(false);
3        mCheckBoxPref.setSummary(enabling?R.string.airplane_mode_turning_on
4        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)
  如果使能wifisetWifiEnabledBlocking(true,msg.arg1 == 1, msg.arg2);
  开启wifimWifiStateTracker.setScanOnlyMode(msg.arg1 != 0);
  setWifiEnabledBlocking(false,msg.arg1 == 1, msg.arg2);
  断开 mWifiStateTracker.disconnectAndStop();
  开启过程步骤:
  1> 装载 wifi 驱动: WifiNative.loadDriver()
  2> 启动后退 daemo supplicant WifiNative.startSupplicant()
  关闭过程步骤:
  1> 停止后退 daemo supplicantWifiNative.stopSupplicant()
  2> 卸载 wifi 驱动: WifiNative.unloadDriver()
  如果 wifi 状态默认为开启那么 WifiService 服务的构造函数:
  WifiService(Contextcontext, WifiStateTracker tracker)
  booleanwifiEnabled = getPersistedWifiEnabled();
  setWifiEnabledBlocking(wifiEnabled,false, Process.myUid());
  会开启wifi模块。






回复

使用道具 举报

发表于 2014-8-28 09:22:21 | 显示全部楼层
厉害,学习了

回复 支持 反对

使用道具 举报

发表于 2014-8-28 10:36:54 | 显示全部楼层
有什么用?你还准备带你的Cubieboard去飞机上飞一下?就是你能带上飞机,你怎么供电呢?电都供不了,你还设置毛的飞行模式啊。
回复 支持 反对

使用道具 举报

发表于 2015-1-20 00:05:23 | 显示全部楼层
yanggis 发表于 2014-8-28 10:36
有什么用?你还准备带你的Cubieboard去飞机上飞一下?就是你能带上飞机,你怎么供电呢?电都供不了,你还设 ...

飞机上可以用电脑,也可用移动电源
回复 支持 反对

使用道具 举报

发表于 2015-2-4 12:30:51 | 显示全部楼层
本帖最后由 yanggis 于 2015-2-4 12:32 编辑
zq9610 发表于 2015-1-20 00:05
飞机上可以用电脑,也可用移动电源

那你用什么来显示呢?再搞个显示器带着?再搞个网线,交换机之类的?你以为飞机是你自己的实验室啊?突然一个速降让你和你的CT一起飞上去你就爽了……。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|粤ICP备13051116号|cubie.cc---深刻的嵌入式技术讨论社区

GMT+8, 2024-6-15 12:16 , Processed in 0.023840 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2012 Comsenz Inc. | Style by Coxxs

返回顶部