AndroidWIFIPower managment.docx
- 文档编号:3918914
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:47
- 大小:191.19KB
AndroidWIFIPower managment.docx
《AndroidWIFIPower managment.docx》由会员分享,可在线阅读,更多相关《AndroidWIFIPower managment.docx(47页珍藏版)》请在冰豆网上搜索。
AndroidWIFIPowermanagment
AndroidWIFIPowermanagement
1Screenon/off
1.1Figure
1.2Screenon
1.WhenAndroidisinsuspendmode,ifakeyonkeyboardispressed,ThreadInputDeviceReaderwillbecreatedandprocessthekeyevent.SendamessagetoWindowsmanager.
KeyInputQueue.java
ThreadmThread=newThread("InputDeviceReader")
abstractbooleanpreprocessEvent(InputDevicedevice,RawInputEventevent);
2.Windowsmanagerwillhandlethekeyevent,sendamessagetoPowermanagerService.
WindowManagerService.java
BooleanpreprocessEvent(InputDevicedevice,RawInputEventevent);
userActivity()
3.PowermanagerServicewillsetpowerstateas:
on,sendbroadcastmessage:
ScreenOnIntent
PowerManagerService.java
PublicvoiduserActivity(longtime,booleannoChangeLights,inteventType,booleanforce)
privatevoidsetPowerState(intnewState,booleannoChangeLights,intreason)
privatevoidsendNotificationLocked(booleanon,intwhy)
mNotificationTask
->mContext.sendOrderedBroadcast(mScreenOnIntent,null,
mScreenOnBroadcastDone,mHandler,0,null,null);
4.WifiServicewillreceivetheSCREEN_ONintent,willenableRssipolling,thencallupdateWifiState.
if(action.equals(Intent.ACTION_SCREEN_ON)){
Log.d(TAG,"ACTION_SCREEN_ON");
mAlarmManager.cancel(mIdleIntent);
mDeviceIdle=false;
mScreenOff=false;
mWifiStateTracker.enableRssiPolling(true);
5.updateWifiStatewillsendstartdrivermessage:
MESSAGE_START_WIFItoWifiServiceitself.
if(wifiShouldBeEnabled){
if(wifiShouldBeStarted){
sWakeLock.acquire();
sendEnableMessage(true,false,mLastEnableUid);
sWakeLock.acquire();
sendStartMessage(strongestLockMode==WifiManager.WIFI_MODE_SCAN_ONLY);
}
6.HandleMessagewillcallrestartofWifiStateTracker
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseMESSAGE_START_WIFI:
mWifiStateTracker.setScanOnlyMode(msg.arg1!
=0);
mWifiStateTracker.restart();
sWakeLock.release();
break;
7.restartofWifiStateTrackerwillresetinterface,callWifiNative.startDriverCommand
publicsynchronizedbooleanrestart(){
if(mRunState==RUN_STATE_STOPPED){
mRunState=RUN_STATE_STARTING;
resetInterface(true);
returnWifiNative.startDriverCommand();
}elseif(mRunState==RUN_STATE_STOPPING){
mRunState=RUN_STATE_STARTING;
}
returntrue;
}
8.resetInterfacewillclearwifiipaddress,resetConnectionsandstopDHCP.
/**
*ResetstheWi-Fiinterfacebyclearinganystate,resettinganysockets
*usingtheinterface,stoppingDHCP,anddisablingtheinterface.
*/
publicvoidresetInterface(booleanreenable){
mHaveIpAddress=false;
mObtainingIpAddress=false;
mWifiInfo.setIpAddress(0);
/*
*ResetconnectiondependsonboththeinterfaceandtheIPassigned,
*soitshouldbedonebeforeanychanceoftheIPbeinglost.
*/
NetworkUtils.resetConnections(mInterfaceName);
//StopDHCP
if(mDhcpTarget!
=null){
mDhcpTarget.setCancelCallback(true);
mDhcpTarget.removeMessages(EVENT_DHCP_START);
}
if(!
NetworkUtils.stopDhcp(mInterfaceName)){
Log.e(TAG,"CouldnotstopDHCP");
}
//[Marvell:
]can'tdisableInterfacehereasthedriverwon'tturnitonautomatically
//NetworkUtils.disableInterface(mInterfaceName);
//wenolongernettostarttheinterface(driverdoesthisforus)
//anditledtoproblems-removed.
}
/**
*Thesupplicantisreportingthatwearedisconnectedfromthecurrent
*accesspoint.Often,however,adisconnectwillbefollowedveryshortly
*byareconnecttothesameaccesspoint.Therefore,wedelayresetting
*theconnection'sIPstateforabit.
*/
8.WifiNative.startDriverCommandsendstartdrivereventtowpa_suppliant
9.Wpa_supplicantcallwexttohandlestartdriverevent,wpa_supplicant_run–〉eloop_run(void)–〉tmp->handler(tmp->eloop_data,tmp->user_data);-〉wpa_supplicant_ctrl_iface_receive–〉wpa_supplicant_ctrl_iface_process-〉wpa_supplicant_driver_cmd–〉wpa_drv_driver_cmd-〉wpa_s->driver->driver_cmd(wpa_s->drv_priv,cmd,buf,buf_len);
10.WextwillcallioctltosendcommandtoWlankerneldriver
11.Wlankerneldriverwillhandlestartdrivercommand(nownotsupportyet)
1.3Screenoff
1.WhenAndroidisinrunningmode,ifthepowerkeyispressed,ThreadInputDeviceReaderwillbecreatedandprocessthekeyevent.SendamessagetoWindowsmanager.
KeyInputQueue.java
ThreadmThread=newThread("InputDeviceReader")
abstractbooleanpreprocessEvent(InputDevicedevice,RawInputEventevent);
2.Windowsmanagerwillhandlethekeyevent,sendamessagetoPowermanagerService.
WindowManagerService.java
BooleanpreprocessEvent(InputDevicedevice,RawInputEventevent);
userActivity()
3.PowermanagerServicewillcallsetPowerStatetosetpowerstate,callsendNotificationLockedtonotifypoweronevent.willcallscreenTurnedOffofKeyguardViewMediatortoturnoffscreen,callgoingToSleep()ofActivityManagerServicetopauseactivity,broadcastintent,Intent(Intent.ACTION_SCREEN_OFF),sendbroadcastmessage:
ScreenOnIntent
PowerManagerService.java
PublicvoiduserActivity(longtime,booleannoChangeLights,inteventType,booleanforce)
privatevoidsetPowerState(intnewState,booleannoChangeLights,intreason)
privatevoidsendNotificationLocked(booleanon,intwhy)
4.WifiServicewillreceivetheSCREEN_OFFintent,willdisableRssipolling,
SetanalarmtimertosendACTION_DEVICE_IDLE
elseif(action.equals(Intent.ACTION_SCREEN_OFF)){
Log.d(TAG,"ACTION_SCREEN_OFF");
mScreenOff=true;
mWifiStateTracker.enableRssiPolling(false);
/*
*SetatimertoputWi-Fitosleep,butonlyifthescreenisoff
*ANDthe"stayonwhilepluggedin"settingdoesn'tmatchthe
*currentpowerconditions(i.e,notpluggedin,pluggedintoUSB,
*orpluggedintoAC).
*/
if(!
shouldWifiStayAwake(stayAwakeConditions,mPluggedType)){
WifiInfoinfo=mWifiStateTracker.requestConnectionInfo();
if(info.getSupplicantState()!
=SupplicantState.COMPLETED){
//weusedtogotosleepimmediately,butthiscausedsomeraceconditions
//wedon'thavetimetotrackdownforthisrelease.Delayinstead,butnot
//aslongaswewouldifconnected(below)
//TODO-fixtheraceconditionsandswitchbacktotheimmediateturn-off
longtriggerTime=System.currentTimeMillis()+(2*60*1000);//2min
Log.d(TAG,"settingACTION_DEVICE_IDLEtimerfor120,000ms");
mAlarmManager.set(AlarmManager.RTC_WAKEUP,triggerTime,mIdleIntent);
////donotkeepWifiawakewhenscreenisoffifWifiisnotassociated
//mDeviceIdle=true;
//updateWifiState();
}else{
longtriggerTime=System.currentTimeMillis()+idleMillis;
Log.d(TAG,"settingACTION_DEVICE_IDLEtimerfor"+idleMillis+"ms");
mAlarmManager.set(AlarmManager.RTC_WAKEUP,triggerTime,mIdleIntent);
}
}
5.updateWifiStatewillsendstartdrivermessage:
MESSAGE_STOP_WIFItoWifiServiceitself.
sDriverStopWakeLock.acquire();
mWifiHandler.sendEmptyMessage(MESSAGE_STOP_WIFI);mWifiHandler.sendEmptyMessageDelayed(MESSAGE_RELEASE_WAKELOCK,wakeLockTimeout);
6.HandleMessagewillcalldisconnectAndStopofWifiStateTracker
publicvoidhandleMessage(Messagemsg){
caseMESSAGE_STOP_WIFI:
mWifiStateTracker.disconnectAndStop();
//don'treleasewakelock
break;
7.disconnectAndStopofWifiStateTrackercallWifiNative.disconnectCommandfirsttodisconnectthewifinetwork.
/**
*Wewanttostopthedriver,butifwe'reconnectedtoanetwork,
*wefirstwanttodisconnect,sothatthesupplicantisalwaysin
*aknownstate(DISCONNECTED)whenthedriverisstopped.
*@return{@codetrue}iftheoperationsucceeds,whichmeansthatthe
*disconnectorstopcommandwasinitiated.
*/
publicsynchronizedbooleandisconnectAndStop(){
if(mRunState!
=RUN_STATE_STOPPING&&mRunState!
=RUN_STATE_STOPPED){
//Takedownanyopennetworknotifications
setNotificationVisible(false,0,false,0);
mRunState=RUN_STATE_STOPPING;
if(mWifiInfo.getSupplicantState()==SupplicantState.DORMANT){
returnWifiNative.stopDriverCommand();
}else{
returnWifiNative.disconnectCommand();
}
}else{
/*
*The"driver-stop"wakelocknormallyisreleasedfromthe
*connectivitymanagerafterthemobiledataconnectionhas
*beenestablished,orafteratimeoutperiod,ifthatnever
*happens.BecauseWifiService.updateWifiState()cangetcalled
*multipletimes,wecanendupacquiringthewakelockandcalling
*disconnectAndStop()evenwhenadisconnectorstopoperation
*isalreadyinprogress.Inthatcase,wewanttoignorethe
*disconnectAndStoprequestandreleasethe(ref-counted)wake
*lock,sothateventually,whenthemobiledataconnectionis
*established,therefcountwilldroptozero.
*/
releaseWakeLock();
}
returntrue;
}
8.wpa_supplicant_ctrl_iface_processofhandles“DISCONNECT”command,willcallwpa_supplicant_disassociate,thencallwpa_drv_disassociate
voidwpa_supplicant_disassociate(structwpa_supplicant*wpa_s,
intreason_code)
{
u8*addr=NULL;
if(os_memcmp(wpa_s->bssid,"\x00\x00\x00\x00\x00\x00",ETH_ALEN)!
=0)
{
if(wpa_s->use_client_mlme)
ieee80211_sta_disassociate(wpa_s,reason_code);
else
wpa_drv_disassociate(wpa_s,wpa_s->bssid,reason_code);
addr=wpa_s->bssid;
}
wpa_clear_keys(wpa_s,addr);
wpa_supplicant_mark_disassoc(wpa_s);
wpa_s->current_ssid=NULL;
wpa_sm_set_config(wpa_s->wpa,NULL);
9.wpa_drv_disassociatewillcallwpa_driver_wext_disassociate
staticintwpa_driver_wext_disassociate(void*priv,constu8*addr,
intreason_code)
{
structwpa_driver_wext_data*drv=priv;
wpa_printf(MSG_DEBUG,"%s",__FUNCTION__);
returnwpa_driver_wext_mlme(drv,addr,IW_MLME_DISASSOC,
reason_code);
}
10.wpa_driver_wext_disassociatecallwpa_driver_wext
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- AndroidWIFIPower managment