Settings模块-一级菜单数据加载

740 阅读2分钟

「这是我参与11月更文挑战的第3天,活动详情查看:2021最后一次更文挑战

继上一篇文章之后,我们继续谈一谈Settings模块,一级菜单、二级菜单数据加载流程。

一级菜单数据加载

菜单数据加载首先从Settings.java开始分析,Settings继承自SettingsActivity,SettingsActivity继承自SettingsDrawerActivity,在SettingsDrawerActivity的onResume()中对数据进行加载。

图片8.png

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文件来进行加载的,它是所有二级界面的基类。

图片9.png

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()方法调用来进行添加。