Chinaunix首页 | 论坛 | 博客
  • 博客访问: 430464
  • 博文数量: 125
  • 博客积分: 2066
  • 博客等级: 大尉
  • 技术积分: 1032
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-16 14:06
文章分类

全部博文(125)

文章存档

2011年(125)

分类: LINUX

2011-08-03 10:33:59

Android 启动过程代码分析(下)

GSM模块切换过程分析:
phone.setRadioPower(enabled)调用的是:
文件 GSMPhone.java 中的的函数:
public void setRadioPower(boolean power)
  mSST.setRadioPower(power);
因为有 ServiceStateTracker mSST;
mSST.setRadioPower 调用的是文件 ServiceStateTracker.java 中的函数:
public void setRadioPower(boolean power)
  mDesiredPowerState = power;
  setPowerStateToDesired();
    cm.setRadioPower(true, null);
        或者
    cm.setRadioPower(false, null);
因为有:
CommandsInterface cm;
public final class RIL extends BaseCommands implements CommandsInterface
所以  cm.setRadioPower 调用的是文件  RIL.java  中的函数:
public void setRadioPower(boolean on, Message result)
  RILRequest rr = 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 中的函数:
public synchronized boolean enable(boolean saveSetting)
  setBluetoothState(BluetoothDevice.BLUETOOTH_STATE_TURNING_ON);
  mEnableThread = new EnableThread(saveSetting);
  mEnableThread.start();
----
disable(false)
蓝牙关闭调用文件 中的函数:
public synchronized 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 void updateWifiState()
如果需要使能开启 wifi 那么会发送:
sendEnableMessage(true, false, mLastEnableUid);
sendStartMessage(strongestLockMode == WifiManager.WIFI_MODE_SCAN_ONLY);
mWifiHandler.sendEmptyMessage(MESSAGE_STOP_WIFI);
消息循环中处理命令消息:
public void handleMessage(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(Context context, WifiStateTracker tracker)
  boolean wifiEnabled = getPersistedWifiEnabled();
  setWifiEnabledBlocking(wifiEnabled, false, Process.myUid());
会开启wifi模块。
阅读(2856) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~