基于Android 9.0 ATV版 TVSetting源码,研究TVSetting Wifi连接方法
一、总结
应该说研究Android TVSetting Wifi的主要目的,是为了学习Google的写法和思路,纵缆TVSetting Wifi 的框架,有几个部分是值的学习和研究的
1.Jetpack架构
整个TVSetting都应用了Jetpack架构,用到组件包括Lifecycle,Lifecycle用于帮助开发者管理Activity和Fragment 的生命周期,还有LiveData和ViewModel
2.WifiTracker的设计思路和方法
WifiTracker不单是提供TVSetting,而是作为一个公共类,由com.android.settingslib提供给TVSetting和Setting使用
3.WifiConnectionActivity状态机框架的应用。
4.Wifi的评分机制
二、Android TVSetting 中Jetpack组件的应用
2.1 WifiTracker WifiTracker实现了LifecycleObserver观察者接口
public class WifiTracker implements LifecycleObserver, OnStart, OnStop, OnDestroy {
,在构造函数中要求必须传入一个Lifecycle,并且向LifecycleOwner注册
只要使用WifiTracker,就必须实现LifecycleOwner,进而被WifiTracker观察,实现进一步操作。
public WifiTracker(Context context, WifiListener wifiListener,
@NonNull Lifecycle lifecycle, boolean includeSaved, boolean includeScans) {
this(context, wifiListener,
context.getSystemService(WifiManager.class),
context.getSystemService(ConnectivityManager.class),
context.getSystemService(NetworkScoreManager.class),
newIntentFilter());
//WifiTracker注册为观察者
lifecycle.addObserver(this);
}
2.2NetworkFragment继承了SettingsPreferenceFragment,实现了LifecycleOwner
作为Lifecycle的被观察者。
SettingsPreferenceFragment作为TVSetting 菜单的基类,管理各个功能的生命周期
public abstract class SettingsPreferenceFragment extends LeanbackPreferenceFragment
implements LifecycleOwner, Instrumentable {
private final Lifecycle mLifecycle = new Lifecycle(this);
private final VisibilityLoggerMixin mVisibilityLoggerMixin;
protected MetricsFeatureProvider mMetricsFeatureProvider;
@NonNull
public Lifecycle getLifecycle() {
return mLifecycle;
}
public SettingsPreferenceFragment() {
mMetricsFeatureProvider = new MetricsFeatureProvider();
// Mixin that logs visibility change for activity.
mVisibilityLoggerMixin = new VisibilityLoggerMixin(getMetricsCategory(),
mMetricsFeatureProvider);
getLifecycle().addObserver(mVisibilityLoggerMixin);
}
public class NetworkFragment extends SettingsPreferenceFragment implements
ConnectivityListener.Listener, ConnectivityListener.WifiNetworkListener,
AccessPoint.AccessPointListener {
.......
@Override
public void onCreate(Bundle savedInstanceState) {
//向ConnectivityListener传入getLifecycle()
mConnectivityListener = new ConnectivityListener(getContext(), this, getLifecycle());
mUserBadgeCache =
new AccessPointPreference.UserBadgeCache(getContext().getPackageManager());
super.onCreate(savedInstanceState);
}
}
ConnectivityListener构造函数中创建了WifiTracker,并将Lifecycle传递给WifiTracker
public ConnectivityListener(Context context, Listener listener, Lifecycle lifecycle) {
mContext = context;
mConnectivityManager = (ConnectivityManager) mContext.getSystemService(
Context.CONNECTIVITY_SERVICE);
mWifiManager = mContext.getSystemService(WifiManager.class);
mEthernetManager = mContext.getSystemService(EthernetManager.class);
mListener = listener;
if (lifecycle != null) {
//构造WifiTracker
mWifiTracker = new WifiTracker(context, this, lifecycle, true, true);
} else {
mWifiTracker = new WifiTracker(context, this, true, true);
}
}
WifiTracker 观察NetworkFragment 的OnStart事件,当触发OnStart时,将调用WifiTracker的OnStart,触发wifi刷新。实际跟踪代码时会先调用WifiTracker的onStart(),然后调用NetworkFragment 的OnStart
@Override
@MainThread
public void onStart() {
// fetch current ScanResults instead of waiting for broadcast of fresh results
//更新当前wifi信息
forceUpdate();
registerScoreCache();
mNetworkScoringUiEnabled =
Settings.Global.getInt(
mContext.getContentResolver(),
Settings.Global.NETWORK_SCORING_UI_ENABLED, 0) == 1;
mMaxSpeedLabelScoreCacheAge =
Settings.Global.getLong(
mContext.getContentResolver(),
Settings.Global.SPEED_LABEL_CACHE_EVICTION_AGE_MILLIS,
DEFAULT_MAX_CACHED_SCORE_AGE_MILLIS);
resumeScanning();
if (!mRegistered) {
mContext.registerReceiver(mReceiver, mFilter, null /* permission */, mWorkHandler);
// NetworkCallback objects cannot be reused. http://b/20701525 .
mNetworkCallback = new WifiTrackerNetworkCallback();
mConnectivityManager.registerNetworkCallback(
mNetworkRequest, mNetworkCallback, mWorkHandler);
mRegistered = true;
}
}
3.总结 通过Lifecycle,当wifi使能的情况下,每次进入WifiTracker都会刷新一次,实际验证过程中,当把WifiTracker构造函数中的 lifecycle.addObserver(this)屏蔽,WifiTracker将不再触发Onstart()事件。下一章开始深入的研究WifiTracker