Android教程之开机流程全面解析
开机过程中无线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁
本文详细讲述了Android的开机流程。分享给大家供大家参考,具体如下:
开机过程中无线模块的初始化过程;如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用 wm.systemReady()来通知大家。这时候该做什么就做什么。
开机过程中无线模块的初始化过程:
rild 调用参考实现 Reference-ril.c (hardware\ril\reference-ril) 中的函数:
const RIL_RadioFunctions *RIL_Init(const struct RIL_Env *env, int argc, char **argv) ret = pthread_create(&s_tid_mainloop, &attr, mainLoop, NULL); static void *mainLoop(void *param) ret = at_open(fd, onUnsolicited); RIL_requestTimedCallback(initializeCallback, NULL, &TIMEVAL_0);
在 initializeCallback 函数中对猫进行了初始化。
static void initializeCallback(void *param) { ATResponse *p_response = NULL; int err; setRadioState (RADIO_STATE_OFF); at_handshake(); /* note: we don't check errors here. Everything important will be handled in onATTimeout and onATReaderClosed */ /* atchannel is tolerant of echo but it must */ /* have verbose result codes */ at_send_command("ATE0Q0V1", NULL); /* No auto-answer */ at_send_command("ATS0=0", NULL); /* Extended errors */ at_send_command("AT+CMEE=1", NULL); /* Network registration events */ err = at_send_command("AT+CREG=2", &p_response); /* some handsets -- in tethered mode -- don't support CREG=2 */ if (err < 0 || p_response->success == 0) { at_send_command("AT+CREG=1", NULL); } at_response_free(p_response); /* GPRS registration events */ at_send_command("AT+CGREG=1", NULL); /* Call Waiting notifications */ at_send_command("AT+CCWA=1", NULL); /* Alternating voice/data off */ at_send_command("AT+CMOD=0", NULL); /* Not muted */ at_send_command("AT+CMUT=0", NULL); /* +CSSU unsolicited supp service notifications */ at_send_command("AT+CSSN=0,1", NULL); /* no connected line identification */ at_send_command("AT+COLP=0", NULL); /* HEX character set */ at_send_command("AT+CSCS=\"HEX\"", NULL); /* USSD unsolicited */ at_send_command("AT+CUSD=1", NULL); /* Enable +CGEV GPRS event notifications, but don't buffer */ at_send_command("AT+CGEREP=1,0", NULL); /* SMS PDU mode */ at_send_command("AT+CMGF=0", NULL); #ifdef USE_TI_COMMANDS at_send_command("AT%CPI=3", NULL); /* TI specific -- notifications when SMS is ready (currently ignored) */ at_send_command("AT%CSTAT=1", NULL); #endif /* USE_TI_COMMANDS */ /* assume radio is off on error */ if (isRadioOn() > 0) { setRadioState (RADIO_STATE_SIM_NOT_READY); } }
默认状况下假设射频模块是好的,
通过 setRadioState (RADIO_STATE_SIM_NOT_READY) 来触发对无线模块的初始化。
通过 static void onRadioPowerOn() 对无线模块初始化。
首先通过 pollSIMState(NULL); 轮询 sim卡状态 。
static void pollSIMState (void *param) { ATResponse *p_response; int ret; if (sState != RADIO_STATE_SIM_NOT_READY) { // no longer valid to poll return; } switch(getSIMStatus()) { case RIL_SIM_ABSENT: case RIL_SIM_PIN: case RIL_SIM_PUK: case RIL_SIM_NETWORK_PERSONALIZATION: default: setRadioState(RADIO_STATE_SIM_LOCKED_OR_ABSENT); return; case RIL_SIM_NOT_READY: RIL_requestTimedCallback (pollSIMState, NULL, &TIMEVAL_SIMPOLL); return; case RIL_SIM_READY: setRadioState(RADIO_STATE_SIM_READY); return; } }
读取sim卡状态的函数是:getSIMStatus()
err = at_send_command_singleline("AT+CPIN?", "+CPIN:", &p_response);
它向猫发送了at命令 AT+CPIN? 来查询无线模块的状态,如果无线模块还没有就绪,那么他隔1秒钟继续调用
sim卡状态轮询函数 pollSIMState,直到获得sim卡状态。
当sim卡状态为就绪,那么通过 setRadioState(RADIO_STATE_SIM_READY) 设置变量 sState 为:
RADIO_STATE_SIM_READY,这时候会调用函数 static void onSIMReady()来进一步初始化无线模块。
发送的at命令有:
at_send_command_singleline("AT+CSMS=1", "+CSMS:", NULL); at_send_command("AT+CNMI=1,2,2,1,1", NULL);
如果sim卡锁开启,或者pin被锁住的时候,会要求输入pin或者puk,但是这个解锁动作必须在系统初始化完成以后才能进行。(图形系统都还没有初始化怎么输入密码阿?)当系统初始化完成以后会调用 wm.systemReady()来通知大家。这时候该做什么就做什么。
wm.systemReady()的调用会触发解锁界面。具体流程如下:
因为有: WindowManagerService wm = null;
所以 wm.systemReady()
调用的是 WindowManagerService 中的函数:
public void systemReady() { mPolicy.systemReady(); }
WindowManagerService 中有:
希望本文所述对大家Android程序设计有所帮助。