Android O Settings原始碼流程分析(資料載入之二級選單)
Android O Settings
資料載入之二級選單
二級選單是動態載入和靜態xml佈局檔案相結合的方式。
以“系統”這一項為例進行分析:
首先是清單檔案AndroidManifest.xml
所對應的Fragment是SystemDashboardFragment.java,它繼承DashboardFragment.java。
而DashboardFragment繼承於PreferenceFragment
PreferenceFragment是通過xml檔案來進行載入的,它是所有二級介面的基類。
先看靜態載入部分:DashboardFragmen——>displayResourceTiles()
先呼叫getPreferenceScreenResId()獲取xml佈局檔案的資源id,該方法在其子類SystemDashboardFragment中實現:
然後呼叫addPreferencesFromResource()方法載入該XML 檔案
(相當於設定佈局setContentView)
獲取PreferenceScreen物件screen用於展示所有的子選單項
遍歷AbstractPreferenceController物件集合,獲取到所有可展示的子選單項;並將它新增進Screen物件中用於展示。
該集合是在SystemDashboardFragment中實現資料載入的工作;
下圖是通過log打印出的“系統”項下所有可展示的子選單:
注:AbstractPreferenceController是用於對所有選單項進行統一管理的一個抽象類(例如展示或隱藏,監聽點選事件等);
有幾個重要的方法需要被重寫:
1、getPreferenceKey()用於獲取到XML檔案中每個Preference節點對應的key值;
2、isAvailable()用於判斷該選單項是否可以顯示
3、updateState()用於 當設定頁面選項發生改變時
再看動態載入部分:DashboardFragmen——>refreshDashboardTiles()
首先是利用mDashboardFeatureProvider物件獲取子選單所屬類別(例如:系統);
getCategoryKey()從DashboardFragmentRegistry.PARENT_TO_CATEGORY_KEY_MAP中獲取Category值。
該值通過類名獲取
存:PARENT_TO_CATEGORY_KEY_MAP.put(SystemDashboardFragment.class.getName(), CategoryKey.CATEGORY_SYSTEM);
CATEGORY_SYSTEM = "com.android.settings.category.ia.system";
然後獲取該類別下所有的子選單項;
然後建立一個List用於儲存那些被移除的選單項;
接下來就是遍歷獲取的tiles集合,
通過判斷key值,是否為空,是否已經被包含(mDashboardTilePrefKeys集合)
對每一個符合要求的tile與Preference通過bindPreferenceToTile()進行繫結;
該方法實現是在:packages\apps\Settings\src\com\android\settings\dashboard\DashboardFeatureProviderImpl.java->bindPreferenceToTile()
最終將介面顯示出來;