一级网络设置项UI渲染的过程
点击事件触发设置按钮点击事件

生成了一个Intent传递给了ATMS,利用了别名启动,别名启动日志中看到的不是实际类名而是别名;根据Intent中的action和category启动了SettingsHomepageActivity。
SettingsHomepageActivity.onCreate
在该方法中将一个PreferenceFragmentCompat的子类实体(TopLevelSettings)添加进布局的R.id.main_content。
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的逻辑;
属性含义
- android:fragment=“com.android.settings.network.NetworkDashboardFragment”
含义:当用户点击该 Preference(设置项)时,会启动 com.android.settings.network.NetworkDashboardFragment 这个 Fragment。即,点击后跳转到网络设置界面。 - android:icon=“@drawable/ic_settings_wireless”
含义:设置该 Preference 前的图标,这里引用了一个名为 ic_settings_wireless 的 drawable 资源,通常是一个无线网络图标。 - android:key=“top_level_network”
含义:为该 Preference 设置唯一标识符(key),用于代码逻辑中的查找与操作,比如保存/恢复状态。Preference 存储数据和修改数据的关键,也是实现ViewModel模式的关键 - android:order=“-150”
含义:设置该 Preference 在父容器中的排序顺序。数值越小,显示位置越靠前。负数通常使它排序在最前。 - android:title=“@string/network_dashboard_title”
含义:显示在 Preference 项目的标题(大字),此处引用的是字符串资源 network_dashboard_title(一般为“网络和互联网”或者“网络设置”等)。 - android:summary=“@string/summary_placeholder”
含义:显示该 Preference 的子标题(小字),通常用于展示状态或进一步说明。此处是 summary_placeholder,可根据需要动态更新。summary_placeholder在代码中是个空格占位符 - settings:highlightableMenuKey=“@string/menu_key_network”
含义:settings: 前缀表示这是自定义命名空间属性,属于 SettingsLib 或相关自定义控件扩展。
作用通常是:指定用于高亮(highlight)当前菜单或项的唯一 key,方便主界面选中高亮此卡片。menu_key_network 是定义在 strings.xml 的值。 - settings:controller=“com.android.settings.network.TopLevelNetworkEntryPreferenceController”
含义:也是自定义的属性,用于指明该 Preference 由哪个控制器类(Controller)管理。
控制器作用:通常用于动态设置标题、summary、启用/禁用状态,或者处理点击事件等。这里由 com.android.settings.network.TopLevelNetworkEntryPreferenceController 控制。

被折叠的 条评论
为什么被折叠?



