基于Android 9.0 ATV版 TVSetting源码,研究TVSetting Wifi连接方法
最近再做投影的系统设置,再做wifi连接部分,总是感觉写的不太好,所以研究了一下TVSetting 的WIFI连接部分,学习一下。
TVSetting wifi连接部分的代码位于packages\apps\TvSettings\Settings\src\com\android\tv\settings\connectivity下。
为了更好的理解,首先将该目录下的相关java文件进行概括性了解
1.主菜单项
➢NetworkActivity.java
负责启动NetworkFragment
➢NetworkFragment.java
TVSetting 网络主菜单,这里罗列NetworkFragment持有的几个关键类
mConnectivityListener(ConnectivityListener):实现具体的wifi策略
mWifiNetworksCategory(CollapsibleCategory):显示wifi列表,继承PreferenceCategory。每个wifi热点,都会创建一个AccessPointPreference,然后加入到mWifiNetworksCategory中
private void updateWifiList() {
............
//获得扫描到的wifi
final Collection<AccessPoint> accessPoints = mConnectivityListener.getAvailableNetworks();
int index = 0;
for (final AccessPoint accessPoint : accessPoints) {
//为每个访问点创建监听
accessPoint.setListener(this);
//创建AccessPointPreference
AccessPointPreference pref = (AccessPointPreference) accessPoint.getTag();
if (pref == null) {
pref = new AccessPointPreference(accessPoint, themedContext, mUserBadgeCache,
false);
accessPoint.setTag(pref);
} else {
toRemove.remove(pref);
}
//根据wifi状态设置单击选项进入的界面
if (accessPoint.isActive()) {
pref.setFragment(WifiDetailsFragment.class.getName());
WifiDetailsFragment.prepareArgs(pref.getExtras(), accessPoint);
pref.setIntent(null);
} else {
pref.setFragment(null);
pref.setIntent(WifiConnectionActivity.createIntent(getContext(), accessPoint));
}
pref.setOrder(index++);
// Double-adding is harmless
mWifiNetworksCategory.addPreference(pref);
}
...........
}
2.公共核心类
➢ConnectivityListener.java--负责监听网络状态,其中持有的几个关键类
mWifiTracker(管理wifi扫描和结果,位于com.android.settingslib.wifi.WifiTracker)
mWifiManager(管理wifi)
mEthernetManager(管理以太网)
3.wifi部分
➢WifiConnectionActivity.java -wifi未连接会进入到该界面
➢WifiDetailsFragment.java-wifi已连接会调用,显示wifi细节
➢WifiConfig.java-wifi配置
➢WifiConfigHelper.java-wifi配置Helper类
3.1.wifi状态机
TVSetting 为每个wifi维护了一个AccessPointPreference,为了更好的管理每个热点的状态,采用了状态机的方法来管理的设计模式,值得借鉴。
3.1 .1公共类packages\apps\TvSettings\Settings\src\com\android\tv\settings\connectivity\util
➢StateMachine.java-状态机管理类
➢State.java-状态机父类
➢Transition.java-状态机转换类
3.1.2 wifi状态
➢ConnectAuthFailureState.java-连接失败
➢ConnectFailedState.java-连接失败状态
➢ConnectRejectedByApState.java
➢ConnectState.java-连接状态
➢ConnectTimeOutState.java-连接超时状态
➢EnterPasswordState.java-输入密码状态
➢KnownNetworkState.java-未知网络状态
➢SuccessState.java--连接成功状态
➢OptionsOrConnectState.java
➢AddStartState.java --添加wifi状态
➢FinishState.java --完成状态
3.2.附录编译调试方法
编译TvSettings
mmm packages/apps/TvSettings/Settings/
编译SettingsLib
屏蔽packages\SettingsLib\Android.mk最后一句话
# For the test package.
#include $(call all-makefiles-under, $(LOCAL_PATH))
mmm frameworks/base/packages/SettingsLib/