WifiSettings源码分析一.docx

上传人:b****1 文档编号:202218 上传时间:2023-04-28 格式:DOCX 页数:29 大小:87.65KB
下载 相关 举报
WifiSettings源码分析一.docx_第1页
第1页 / 共29页
WifiSettings源码分析一.docx_第2页
第2页 / 共29页
WifiSettings源码分析一.docx_第3页
第3页 / 共29页
WifiSettings源码分析一.docx_第4页
第4页 / 共29页
WifiSettings源码分析一.docx_第5页
第5页 / 共29页
WifiSettings源码分析一.docx_第6页
第6页 / 共29页
WifiSettings源码分析一.docx_第7页
第7页 / 共29页
WifiSettings源码分析一.docx_第8页
第8页 / 共29页
WifiSettings源码分析一.docx_第9页
第9页 / 共29页
WifiSettings源码分析一.docx_第10页
第10页 / 共29页
WifiSettings源码分析一.docx_第11页
第11页 / 共29页
WifiSettings源码分析一.docx_第12页
第12页 / 共29页
WifiSettings源码分析一.docx_第13页
第13页 / 共29页
WifiSettings源码分析一.docx_第14页
第14页 / 共29页
WifiSettings源码分析一.docx_第15页
第15页 / 共29页
WifiSettings源码分析一.docx_第16页
第16页 / 共29页
WifiSettings源码分析一.docx_第17页
第17页 / 共29页
WifiSettings源码分析一.docx_第18页
第18页 / 共29页
WifiSettings源码分析一.docx_第19页
第19页 / 共29页
WifiSettings源码分析一.docx_第20页
第20页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

WifiSettings源码分析一.docx

《WifiSettings源码分析一.docx》由会员分享,可在线阅读,更多相关《WifiSettings源码分析一.docx(29页珍藏版)》请在冰点文库上搜索。

WifiSettings源码分析一.docx

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

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 院校资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2