总结:

首先,找到Settings目录,打开AndroidManifest文件,确定Setting启动时调用的类Settings.java。Settings继承于SettingsActivity,内部定义了其他的子类,也继承于SettingsActivity,从注释可以知道,这种定义方式使得内部子类可以独立的调用跳转到对应界面。

/** Settings subclasses for launching independently.*/

打开SettingsActivity.java,SettingsActivity继承于SettingsDrawerActivity,SettingDrawerActivity中主要是在初始化时添加包的安装、移除、修改、更新的监听和注册广播以及启动线程更新category。此外,SettingDrawerActivity中覆写了setContentView方法使得子类可以将view添加到R.id.content_framet容器中。

重新回到SettingsActivity的onCreate方法,留意getMetaData方法,用于获取Activity的meta-data字段,然后赋值给mFragmentClass,也就是要显示的Fragment的完整包名路径。在SettingsActivity中覆写了getIntent方法将要填转的界面赋值给EXTRA_SHOW_FRAGMENT,在setContentView时会对要显示的界面进行判断,Setting根界面和子类界面会调用不同的layout,然后分别调用switchToFragment方法加载不同的内容。

加载内容以DashboardSummary.java为例,首先看到onCreateView方法,R.layout.dashboard本身是一个recyclerview布局,除去基本的界面和recyclerview设置,直接看rebuildUI方法,里面调用了updateCategory方法。CategoryKey.CATEGORY_HOMEPAGE 实际上就是 com.android.settings.category.ia.homepage,也就是说category是从AndroidManifest文件解析 

getTilesForAction(context, user, SETTINGS_ACTION, cache, null, tiles, true,

settingPkg);

getTilesForAction(context, user, OPERATOR_SETTINGS, cache,

OPERATOR_DEFAULT_CATEGORY, tiles,false, true, settingPkg);

getTilesForAction(context, user, MANUFACTURER_SETTINGS, cache,

MANUFACTURER_DEFAULT_CATEGORY, tiles,false, true, settingPkg);

}if(setup) {

getTilesForAction(context, user, EXTRA_SETTINGS_ACTION, cache,null, tiles, false,

settingPkg);if (!categoryDefinedInManifest) {

getTilesForAction(context, user, IA_SETTINGS_ACTION, cache,null, tiles, false,

settingPkg);if (extraAction != null) {

getTilesForAction(context, user, extraAction, cache,null, tiles, false,

settingPkg);

}

可以看出,要填充那些子类是从AndroidManifest文件中解析Action相对应的Activity来确定的。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐