Android TVSetting Wifi连接分析(二)

本文主要探讨了Android 9.0 ATV版TVSetting中基于Jetpack架构的Wifi连接方法。重点讲述了Jetpack组件如Lifecycle在WifiTracker和NetworkFragment中的应用,以及WifiTracker的状态管理和刷新机制。通过Lifecycle,每当进入WifiTracker时,系统会自动刷新Wifi信息。此外,还介绍了WifiTracker作为公共类服务于多个设置模块的设计思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于Android 9.0 ATV版 TVSetting源码,研究TVSetting Wifi连接方法

一、总结

应该说研究Android TVSetting Wifi的主要目的,是为了学习Google的写法和思路,纵缆TVSetting Wifi 的框架,有几个部分是值的学习和研究的

Android TVSetting Wifi连接分析(一)

Android TVSetting Wifi连接分析(二)

Android 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值