Settings模块-一级菜单数据加载
继上一篇文章之后,我们继续谈一谈Settings模块,一级菜单、二级菜单数据加载流程。
一级菜单数据加载
菜单数据加载首先从Settings.java开始分析,Settings继承自SettingsActivity,SettingsActivity继承自SettingsDrawerActivity,在SettingsDrawerActivity的onResume()中对数据进行加载。
1. 在onResume()中执行了一个异步操作:new CategoriesUpdateTask().execute()
private class CategoriesUpdateTask extends AsyncTask<Void, Void, Void> { private final CategoryManager mCategoryManager; public CategoriesUpdateTask() { mCategoryManager = CategoryManager.get(SettingsDrawerActivity.this); } protected Void doInBackground(Void... params) { mCategoryManager.reloadAllCategories(SettingsDrawerActivity.this,getSettingPkg()); return null; } protected void onPostExecute(Void result) { mCategoryManager.updateCategoryFromBlacklist(sTileBlacklist); onCategoriesChanged(); } }复制代码
reloadAllCategories() 方法加载数据
onCategoriesChanged() 实现CategoryListener,那么作为界面容器的DashboardSummary肯定重载了这个接口,实现了onCategoriesChanged()方法
2. reloadAllCategories()方法加载数据
(1)首先调用调用了getTilesForAction()方法
(2)调用getTilesForIntent方法
(3)getTilesForIntent中调用updateTileData方法 updateTileData方法,对Activity中的属性进行解析
(4)调用createCategory方法,创建DashboardCategory对象,并且根据tile的category来进行分类,最终getCategories方法会返回包含多个DashboardCategory的ArrayList.
3.onCategoriesChanged()
(1)调用rebuildUI()
(2)调用updateCategoryAndSuggestion(),DashboardSummary在onCreateView加载的布局R.layout.dashboard,是一个recycleview,将DashboardCategory加载进去。
二级菜单数据加载
二级菜单加载调用packages\apps\settings\src\com\android\settings\dashboard\DashboardFragment.java中的displayResourceTiles()方法。
而PreferenceFragment是通过xml文件来进行加载的,它是所有二级界面的基类。
private void displayResourceTiles() { final int resId = getPreferenceScreenResId(); if (resId <= 0) { return; } addPreferencesFromResource(resId); final PreferenceScreen screen = getPreferenceScreen(); Collection<AbstractPreferenceController> controllers = mPreferenceControllers.values(); for (AbstractPreferenceController controller : controllers) { controller.displayPreference(screen); } }复制代码
1.通过getPreferenceScreenResId方法获得要加载xml资源文件文件的ID
2.然后通过addPreferencesFromResource方法加载该xml资源文件, (addPreferencesFromResource方法的具体定义是在PreferenceFragment中)
3.然后获取PreferenceScreen的对象Screen用来展示所有的子菜单项
4.遍历AbstractPreferenceController对象集合,获得所有需要展示子菜单项,添加进screen进行展示。
AbstractPreferenceController是用于对所有菜单项进行统一管理的一个抽象类(例如展示或隐藏,监听点击事件等) AbstractPreferenceController对象是通过mPreferenceControllers获取的。 mPreferenceControllers通过addPreferenceController()方法调用来进行添加。
作者:小郭不背锅
链接:https://juejin.cn/post/7026543696426303501