Settings-----分析网络和互联网加载流程

一级网络设置项UI渲染的过程

点击事件触发设置按钮点击事件

Intent

生成了一个Intent传递给了ATMS,利用了别名启动,别名启动日志中看到的不是实际类名而是别名;根据Intent中的action和category启动了SettingsHomepageActivity。

SettingsHomepageActivity.onCreate

在该方法中将一个PreferenceFragmentCompat的子类实体(TopLevelSettings)添加进布局的R.id.main_content。

PreferenceFragmentCompat渲染过程

PreferenceFragmentCompat生命周期方法

TopLevelSettings.onAttach->DashboardFragment.onAttach

1.通过xml解析出控制器集合;
2.控制器集合都添加为Lifecycle观察者;
3.控制器设置埋点配置;
4.将控制器存储到一个Map中,控制器的类名作为key,value为一个List集合其中添加了控制器类名对应的控制器实体;

PreferenceControllerListHelper .getPreferenceControllersFromXml

PreferenceXmlParserUtils.extractMetadata

通过XmlResourceParser类解析xml文件,将每个节点的属性值封装为一个Bundle,循环遍历整个xml的节点之后输出一个包含xml所有节点信息的List

BasePreferenceController.createInstance

遍历List并把每个Bundle处理为对应的控制器,然后输出控制器集合。

PreferenceFragmentCompat.onCreate

在这里插入图片描述

DashboardFragment.onCreatePreferences

UI创建的核心,包括静态和动态的方式渲染出设置项。

DashboardFragment.refreshAllPreferences->.displayResourceTiles

.addPreferencesFromResource->InstrumentedPreferenceFragment.addPreferencesFromResource->PreferenceFragmentCompat .addPreferencesFromResource在这里插入图片描述

首先是将rootkey对应得PreferenceScreen通过PreferenceManager维护新的PreferenceScreen对象,然后发一个Handler给主线程(msg为MSG_BIND_PREFERENCES),PreferenceFragmentCompat 处理消息后执行绑定PreferenceScreen方法。
在这里插入图片描述

.displayResourceTilesToScreen–>AbstractPreferenceController.displayPreference–>.setVisible

在这里插入图片描述
通过修改Preference存储得可见值,来实现组件得显示隐藏。

DashboardFragment.refreshDashboardTiles->DashboardFeatureProviderImpl.getTilesForCategory–>CategoryManager.getTilesByCategory–>CategoryManager.tryInitCategories

从多数据来源(backwardCompatCleanupForCategory,mergeSecurityPrivacyKeys)来获取系统得设置。

DashboardFragment.refreshDashboardTiles

在这里插入图片描述
这部分是核心。DashboardFeatureProviderImpl是DynamicDataObserver的实现,
// 1. 启动后台线程等待所有数据源
// 2. 主线程等待后台线程完成
// 3. 数据就绪后更新UI

DashboardFeatureProviderImpl

通过内容提供者观察数据变化,绑定各个属性的观察者bindTitleAndGetObserver,bindSummaryAndGetObserver,bindSwitchAndGetObserver,bindIcon

1.数据订阅与监听
2.多数据源并行加载,
3.数据同步等待
awaitObserverLatch方法。
// 等待逻辑:
// 主线程 ────等待───┐
// 后台线程 ──等待Observer1──等待Observer2──等待Observer3──通知主线程─┐
// ↓
// 所有数据就绪后继续

4.UI更新

<com.android.settings.widget.HomepagePreference
            android:fragment="com.android.settings.network.NetworkDashboardFragment"
            android:icon="@drawable/ic_settings_wireless_filled"
            android:key="top_level_network"
            android:order="-20"
            android:title="@string/network_dashboard_title"
            android:summary="@string/summary_placeholder"
            settings:highlightableMenuKey="@string/menu_key_network"
            settings:controller="com.android.settings.network.TopLevelNetworkEntryPreferenceController"/>

HomepagePreference

继承自Preference,主要的实现是通过借助HomepagePreferenceLayoutHelper.onBindViewHolder方法绑定组件动态设置一些属性。如需修改组件的默认值,布局等时可通过这里修改。
通过PreferenceFragmentCompat源码可知PreferenceScreen本质是通过RecyclerView包裹Preference组件来执行布局的,所以这里会有Preference.onBindViewHolder的逻辑;

属性含义

  1. android:fragment=“com.android.settings.network.NetworkDashboardFragment”
    含义:当用户点击该 Preference(设置项)时,会启动 com.android.settings.network.NetworkDashboardFragment 这个 Fragment。即,点击后跳转到网络设置界面。
  2. android:icon=“@drawable/ic_settings_wireless”
    含义:设置该 Preference 前的图标,这里引用了一个名为 ic_settings_wireless 的 drawable 资源,通常是一个无线网络图标。
  3. android:key=“top_level_network”
    含义:为该 Preference 设置唯一标识符(key),用于代码逻辑中的查找与操作,比如保存/恢复状态。Preference 存储数据和修改数据的关键,也是实现ViewModel模式的关键
  4. android:order=“-150”
    含义:设置该 Preference 在父容器中的排序顺序。数值越小,显示位置越靠前。负数通常使它排序在最前。
  5. android:title=“@string/network_dashboard_title”
    含义:显示在 Preference 项目的标题(大字),此处引用的是字符串资源 network_dashboard_title(一般为“网络和互联网”或者“网络设置”等)。
  6. android:summary=“@string/summary_placeholder”
    含义:显示该 Preference 的子标题(小字),通常用于展示状态或进一步说明。此处是 summary_placeholder,可根据需要动态更新。summary_placeholder在代码中是个空格占位符
  7. settings:highlightableMenuKey=“@string/menu_key_network”
    含义:settings: 前缀表示这是自定义命名空间属性,属于 SettingsLib 或相关自定义控件扩展。
    作用通常是:指定用于高亮(highlight)当前菜单或项的唯一 key,方便主界面选中高亮此卡片。menu_key_network 是定义在 strings.xml 的值。
  8. settings:controller=“com.android.settings.network.TopLevelNetworkEntryPreferenceController”
    含义:也是自定义的属性,用于指明该 Preference 由哪个控制器类(Controller)管理。
    控制器作用:通常用于动态设置标题、summary、启用/禁用状态,或者处理点击事件等。这里由 com.android.settings.network.TopLevelNetworkEntryPreferenceController 控制。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值