android 飞行模式分析【转】

  (2012-07-23 14:08:07) 转载
标签: 

杂谈

 

跟飞行模式相关的有几处代码:

1. Setting程序可以设置进入/离开飞行模式,代码位于packages/apps/Settings/src/com/android/settings/AirplaneModeEnabler.java
2. GlobalAction程序(长按power button后出来的界面)中也可以设置进入/离开飞行模式frameworks/policies/base/phone/com/android/internal/policy/impl/GlobalActions.java
3. 飞行模式状态栏图标更新frameworks/base/services/java/com/android/server/status/StatusBarPolicy.java
4. radio switch on/off代码frameworks/base/telephony/java/com/android/internal/telephony中的RIL.java、gsm\GsmServiceStateTracker.java等
5. 蓝牙 switch on/off代码frameworks/base/core/java/android/server/BluetoothDeviceService.java
6. Wifi switch on/off代码frameworks/base/services/java/com/android/server/WifiService.java

1.6:

进入飞行模式的流程:
这里以Setting程序为例(GlobalAction和Setting过程基本上是一样的)
0. 假定手机处于正常状态
1. 用户进入Setting程序,点击enable飞行模式
2. 界面暂时被灰显,然后发出一个ACTION_AIRPLANE_MODE_CHANGED的intent;
3. Radio/蓝牙/Wifi模块都监听ACTION_AIRPLANE_MODE_CHANGED消息,三个模块收到该消息后,都进行从on->off的切换
4. Radio模块在发生on->off切换后,会向上发出notification,告知上层app底下radio state已经发生改变,Setting程序,GlobalAction以及StatusBarPolicy都应filter出这个notification,并做出响应
5. 上层在收到Radio state有改动后,会去检查radio是否真的被关闭
6. 如果radio确认关闭,则认为进入飞行模式成功,界面恢复正常,更新setting中airplane那个菜单项的文字信息

 

1.5:

1.1 通过com.android.settings.WirelessSettings打开飞行模式;

1.1.1 设置飞行模式值;
Settings.System.putInt(mContext.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, enabling ? 1 : 0);

1.1.2 发出Intent(Intent.ACTION_AIRPLANE_MODE_CHANGED)。
AirplaneModeEnabler.setAirplaneModeOn(boolean enabling)

1.2 关闭相关的服务连接

1.2.1 关闭WIFI;
frameworks/base/services/java/com/android/server/WifiService.BroadcastReceiver.onReceive(...)

1.2.2 关闭Bluetooth;
frameworks/base/core/java/android/server/BluetoothDeviceService.BroadcastReceiver.onReceive(...)

1.2.3 关闭RADIO。
PhoneApp.PhoneAppBroadcastReceiver.onReceive(...) -> GSMPhone.setRadioPower(false)->ServiceStateTracker.setRadioPower(false)->ServiceStateTracker.setPowerStateToDesired()->RIL.setRadioPower(true, null)

2/ 取消飞行模式

与打开飞行模式流程类似,false改为true,略。

3/ 飞行模式启动流程

在SIM_READY后,ServiceStateTracker收到RADIO_STATE_CHANGED通知后,关闭RADIO;WIFI和蓝牙部分,则会在对应的服务程序中判断飞行模式设置,如果是飞行模式,则不可用。

下面是RADIO OFF流程:

3.1 正常开机,在RADIO STATE切换到SIM_READY状态后,向上发出EVENT_RADIO_STATE_CHANGED通知;
RADIO.STATE = RADIO_STATE_UNAVAILABLE->RADIO_STATE_OFF->SIM_NOT_READY->SIM_READY
(hardware/ril/reference-ril/reference-ril.c)

3.2 ServiceStateTracker.java初始化,设置mDesiredPowerState = ! (airplaneMode > 0),并调用RIL接口注册EVENT_RADIO_STATE_CHANGED;
frameworks/base/telephony/java/com/android/internal/telephony/gsm/ServiceStateTracker.java

3.3 ServiceStateTracker.java处理RADIO STATE的变化,如果不是飞行模式,设置RADIO状态为ON;如果是飞行模式,且开机状态,则关掉RADIO;

 1       public   void  handleMessage (Message msg)
 2               case  EVENT_RADIO_STATE_CHANGED:
 3                   //  This will do nothing in the radio not
 4                   //  available case
 5                  setPowerStateToDesired();
 6                  pollState();
 7                   break ;
 8       private   void  setPowerStateToDesired()
 9           if  (mDesiredPowerState
10               &&  cm.getRadioState()  ==  CommandsInterface.RadioState.RADIO_OFF
11          ) {
12              cm.setRadioPower( true null );
13          }  else   if  ( ! mDesiredPowerState  &&  cm.getRadioState().isOn()) {
14              dcTracker.cleanConnectionBeforeRadioOff();
15               //  If it's on and available and we want it off..
16              cm.setRadioPower( false null );
17          }  //  Otherwise, we're in the desired state
18      }
3.4 RADIO关掉后(状态变为RADIO_OFF),再向上发一个EVENT_RADIO_STATE_CHANGED通知,参考3.3。

更多相关文章

  1. Mono for Android (2)-- Android应用程序初认识
  2. 使用valgrind检测Android native程序的内存
  3. Android游戏开发实践指南(华章程序员书库)
  4. Android 程序获取、设置铃声和音量
  5. Android 程序获取、设置铃声、音量、静音、扬声器
  6. [置顶] Android系统安全之旅 第1章 编译Android程序的方法
  7. android获取安装的应用程序
  8. android 可执行程序终于可以在nxp8473--cortex-a9平台运行

随机推荐

  1. Android(安卓)SDK 更新太慢问题
  2. Android 学习笔记--android――listview
  3. android SQLite 原理
  4. API Demos 2.2 研读笔记(3)——Custom Dial
  5. Android Studio1.5 配置Android annotati
  6. Android 单独控件实现不同字体大小、不同
  7. 移动开发:Android 错误警告信息解释
  8. 【Android】ant编译aidl的错误
  9. 实现Android屏幕控制Androidscreencast应
  10. android源代码在线查看