「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战」
继上一篇文章之后,我们继续谈一谈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()方法调用来进行添加。