WifiSettings源码分析一.docx
《WifiSettings源码分析一.docx》由会员分享,可在线阅读,更多相关《WifiSettings源码分析一.docx(29页珍藏版)》请在冰点文库上搜索。
WifiSettings源码分析一
WifiSettings源码分析一
搜索到热点就以列表的形式显示出来,我们可对可用的wifi进行连接、保存、添加、删除等操作。
那么这一系列的动作在代码中是如何体现出来的呢?
看代码分析,。
1、onCreate()
@Override
publicvoidonCreate(Bundleicicle){
super.onCreate(icicle);
//设置布局文件
addPreferencesFromResource(R.xml.wifi_settings);
mUserBadgeCache=newUserBadgeCache(getPackageManager());
//启动线程
mBgThread=newHandlerThread(TAG,Process.THREAD_PRIORITY_BACKGROUND);
mBgThread.start();
}
2、onActivityCreated()
@Override
publicvoidonActivityCreated(BundlesavedInstanceState){
super.onActivityCreated(savedInstanceState);
//创建wifitracker对象,设置扫描到wifi后系统发送的广播的action
mWifiTracker=
newWifiTracker(getActivity(),this,mBgThread.getLooper(),true,true,false);
//获取wifi管理器,管理wifi的开启、关闭、扫描、建立连接、配置等信息
mWifiManager=mWifiTracker.getManager();
//wifi连接监听
mConnectListener=newWifiManager.ActionListener(){
@Override
publicvoidonSuccess(){
}
@Override
publicvoidonFailure(intreason){
Activityactivity=getActivity();
if(activity!
=null){
Toast.makeText(activity,
R.string.wifi_failed_connect_message,
Toast.LENGTH_SHORT).show();
}
}
};
//wifi保存监听(右上角menu:
SavedNetworks)
mSaveListener=newWifiManager.ActionListener(){
@Override
publicvoidonSuccess(){
}
@Override
publicvoidonFailure(intreason){
Activityactivity=getActivity();
if(activity!
=null){
Toast.makeText(activity,
R.string.wifi_failed_save_message,
Toast.LENGTH_SHORT).show();
}
}
};
//忘记网络监听
mForgetListener=newWifiManager.ActionListener(){
@Override
publicvoidonSuccess(){
}
@Override
publicvoidonFailure(intreason){
Activityactivity=getActivity();
if(activity!
=null){
Toast.makeText(activity,
R.string.wifi_failed_forget_message,
Toast.LENGTH_SHORT).show();
}
}
};
if(savedInstanceState!
=null){
mDlgEdit=savedInstanceState.getBoolean(SAVE_DIALOG_EDIT_MODE);
mDlgModify=savedInstanceState.getBoolean(SAVE_DIALOG_MODIFY_MODE);
if(savedInstanceState.containsKey(SAVE_DIALOG_ACCESS_POINT_STATE)){
mAccessPointSavedState=
savedInstanceState.getBundle(SAVE_DIALOG_ACCESS_POINT_STATE);
}
if(savedInstanceState.containsKey(SAVED_WIFI_NFC_DIALOG_STATE)){
mWifiNfcDialogSavedState=
savedInstanceState.getBundle(SAVED_WIFI_NFC_DIALOG_STATE);
}
}
//ifwe'resupposedtoenable/disabletheNextbuttonbasedonourcurrentconnection
//state,startitoffintherightstate
Intentintent=getActivity().getIntent();
mEnableNextOnConnection=intent.getBooleanExtra(EXTRA_ENABLE_NEXT_ON_CONNECT,false);
if(mEnableNextOnConnection){
if(hasNextButton()){
finalConnectivityManagerconnectivity=(ConnectivityManager)
getActivity().getSystemService(Context.CONNECTIVITY_SERVICE);
if(connectivity!
=null){
NetworkInfoinfo=connectivity.getNetworkInfo(
ConnectivityManager.TYPE_WIFI);
changeNextButtonState(info.isConnected());
}
}
}
//初始化空的视图
mEmptyView=initEmptyView();
//注册上下文菜单(相当于ListView的长按事件)
registerForContextMenu(getListView());
//在Fragment中给actionbar添加action在onCreate()中调用setHasOptionsMenu(true)。
AndroidFramework会调用Fragement中的onCreateOptionsMenu()来向Activity的Menu中添加item。
setHasOptionsMenu(true);
if(intent.hasExtra(EXTRA_START_CONNECT_SSID)){
mOpenSsid=intent.getStringExtra(EXTRA_START_CONNECT_SSID);
onAccessPointsChanged();
}
}
在OnActivityCreate()函数中首先是创建了WifiTracker对象,经过分析发现这个类是负责启动wifi扫描附近可用热点的类,在启动扫描前进行了广播动作的设置。
但还木有真正的注册广播接收者。
@VisibleForTesting
WifiTracker(Contextcontext,WifiListenerwifiListener,LooperworkerLooper,
booleanincludeSaved,booleanincludeScans,booleanincludePasspoints,
WifiManagerwifiManager,LoopercurrentLooper){
if(!
includeSaved&&!
includeScans){
thrownewIllegalArgumentException("Mustincludeeithersavedorscans");
}
mContext=context;
if(currentLooper==null){
//Whenwearen'tonalooperthread,defaulttothemain.
currentLooper=Looper.getMainLooper();
}
mMainHandler=newMainHandler(currentLooper);
mWorkHandler=newWorkHandler(
workerLooper!
=null?
workerLooper:
currentLooper);
mWifiManager=wifiManager;
mIncludeSaved=includeSaved;
mIncludeScans=includeScans;
mIncludePasspoints=includePasspoints;
mListener=wifiListener;
//checkifverboselogginghas
//检查已打开或关闭的详细日志记录
beenturnedonoroff
sVerboseLogging=mWifiManager.getVerboseLoggingLevel();
mFilter=newIntentFilter();
//wifi状态改变(wifi打开、关闭等改变时会发送广播)
mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
//扫描结束时发送的广播
mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
//网络ID改变
mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION);
//正在连接的状态改变,比如添加删除网络
mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
//网络配置改变
mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION);
//链接配置改变
mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION);
//网络状态改变
mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
//ReceivedSignalStrengthIndication接收的信号强度指示;无线发送层的可选部分;用来判定链接质量;以及是否增大广播发送强度。
//信号强度改变
mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION);
}
创建mMainHandler
privatefinalclassMainHandlerextendsHandler{
privatestaticfinalintMSG_CONNECTED_CHANGED=0;
privatestaticfinalintMSG_WIFI_STATE_CHANGED=1;
privatestaticfinalintMSG_ACCESS_POINT_CHANGED=2;
privatestaticfinalintMSG_RESUME_SCANNING=3;
privatestaticfinalintMSG_PAUSE_SCANNING=4;
publicMainHandler(Looperlooper){
super(looper);
}
@Override
publicvoidhandleMessage(Messagemsg){
if(mListener==null){
return;
}
switch(msg.what){
//连接状态发生变化
caseMSG_CONNECTED_CHANGED:
mListener.onConnectedChanged();
break;
//WiFi状态发生变化
caseMSG_WIFI_STATE_CHANGED:
mListener.onWifiStateChanged(msg.arg1);
break;
//接入点发生变化
caseMSG_ACCESS_POINT_CHANGED:
mListener.onAccessPointsChanged();
break;
//扫描开始,扫描附近可用wifi
caseMSG_RESUME_SCANNING:
if(mScanner!
=null){
mScanner.resume();
}
break;
//扫描暂停
caseMSG_PAUSE_SCANNING:
if(mScanner!
=null){
mScanner.pause();
}
break;
}
}
}
创建WorkHandler
privatefinalclassWorkHandlerextendsHandler{
privatestaticfinalintMSG_UPDATE_ACCESS_POINTS=0;
privatestaticfinalintMSG_UPDATE_NETWORK_INFO=1;
privatestaticfinalintMSG_RESUME=2;
publicWorkHandler(Looperlooper){
super(looper);
}
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
//更新接入点
caseMSG_UPDATE_ACCESS_POINTS:
updateAccessPoints();
break;
//更新网络信息
caseMSG_UPDATE_NETWORK_INFO:
updateNetworkInfo((NetworkInfo)msg.obj);
break;
caseMSG_RESUME:
//清空扫描的结果缓存集合、接入点地址、id。
handleResume();
break;
}
}
}
3、onViewCreate()
@Override
publicvoidonViewCreated(Viewview,BundlesavedInstanceState){
super.onViewCreated(view,savedInstanceState);
finalActivityactivity=getActivity();
if(activity!
=null){
mProgressHeader=(ProgressBar)setPinnedHeaderView(R.layout.wifi_progress_header);
}
}
4、onStart()
@Override
publicvoidonStart(){
super.onStart();
//On/offswitchishiddenforSetupWizard(returnsnull)
mWifiEnabler=createWifiEnabler();
}
WifiEnabler.java这个类是负责wifi开关(SwitchBar)的设置,监听SwitchBar的状态:
打开、正在打开、正在关闭、关闭等状态并随着状态的改变更新UI。
WifiSettings.java调用createWifiEnabler(),创建WifiEnabler对象。
/**
*@returnnewWifiEnablerornull(asoverriddenbyWifiSettingsForSetupWizard)
*/
/*package*/WifiEnablercreateWifiEnabler(){
finalSettingsActivityactivity=(SettingsActivity)getActivity();
returnnewWifiEnabler(activity,activity.getSwitchBar());
}
WifiEnabler.java的构造方法:
publicWifiEnabler(Contextcontext,SwitchBarswitchBar){
mContext=context;
mSwitchBar=switchBar;
mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
mIntentFilter=newIntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION);
//Theordermatters!
Wereallyshouldnotdependonthis.:
(
mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION);
mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
setupSwitchBar();
}
从代码中可以看出这里取得了Wifi管理器,注册广播监听wifi状态、网络状态的变化,创建了SwitchBar开关。
publicvoidsetupSwitchBar(){
//获得wifistate
finalintstate=mWifiManager.getWifiState();
//根据wifistate设置switchbar的打开或关闭。
handleWifiStateChanged(state);
if(!
mListeningToOnSwitchChange){
mSwitchBar.addOnSwitchChangeListener(this);
mListeningToOnSwitchChange=true;
}
//显示开关
mSwitchBar.show();
}
取出wifi的状态,根据wifi的状态来设置SwitchBar,给SwitchBar注册监听器,监听开关的变化。
privatevoidhandleWifiStateChanged(intstate){
switch(state){
//wifi正在打开
caseWifiManager.WIFI_STATE_ENABLING:
mSwitchBar.setEnabled(false);
break;
//wifi已经打开
caseWifiManager.WIFI_STATE_ENABLED:
setSwitchBarChecked(true);
mSwitchBar.setEnabled(true);
updateSearchIndex(true);
break;
//wifi正在关闭
caseWifiManager.WIFI_STATE_DISABLING:
mSwitchBar.setEnabled(false);
break;
//wifi已经关闭
caseWifiManager.WIFI_STATE_DISABLED:
setSwitchBarChecked(false);
mSwitchBar.setEnabled(true);
updateSearchIndex(false);
break;
default:
setSwitchBarChecked(false);
mSwitchBar.setEnabled(true);
updateSearchIndex(false);
}
}
updateSearchIndex()
privatevoidupdateSearchIndex(booleanisWiFiOn){
mHandler.removeMessages(EVENT_UPDATE_INDEX);
Messagemsg=newMessage();
msg.what=EVENT_UPDATE_INDEX;
msg.getData().putBoolean(EVENT_DATA_IS_WIFI_ON,isWiFiOn);
mHandler.sendMessage(msg);
}
privateHandlermHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
caseEVENT_UPDATE_INDEX:
//取出wifi打开或关闭的标识
finalbooleanisWiFiOn=msg.getData().getBoolean(EVENT_DATA_IS_WIFI_ON);
Index.getInstance(mContext).updateFromClassNameResource(
WifiSettings.class.getName(),true,isWiFiOn);
break;
}
}
};
5、onResume()
在o