「这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战」
Settings界面加载
(Settings部分源码在packages/Settings下)
Android系统源码中,Settings模块的功能多达二三十个,包括wifi、蓝牙、nfc、屏幕设置等等重要功能模块。
从Androidmanifest.xml看起,发现程序入口是Settings类,其继承自SettingsActivity,且没有重写任何生命周期函数,只是定义一些空实现的内部类外,作用是当创建快捷方式时启动独立的类。 Setings模块的主界面的Activity为 Settings Setings模块的子界面的Activity为 SubSettings
SettingsActivity:
1.mIsShowingDashboard获取当前类名,通过类名来判断加载布局,判断当前是Settings还是SubSettings来确定用什么布局来显示。
2.在进行界面跳转时, 使用launchSettingFragment(initialFragmentName, isSubSettings, intent)函数中又做出了区分:
(1)首先调用getMetaData()方法,该方法在加载对应的设置项时会从Androidmanifest中声明的Activity的节点下获取到fragmentclass的值。作用是是从Activity标签中获取meta-data标签中key为com.android.settings.FRAGMENT_CLASS的值。
(2)调用getIntent方法:作用是返回intent.
getIntent方法中看到通过getStartingFragmentClass(superIntent)方法创建了startingFragment对象来给Intent赋值,进入getStartingFragmentClass方法:
在获取到startingFragment之后,构建一个intent并为其增加一个特殊的键值对
key:settings:show_fragment(EXTRA_SHOW_FRAGMENT),
value:mfragmentClass指定的类名
(3)final String initialFragmentName = intent.getStringExtra(EXTRA_SHOW_FRAGMENT);
(4)传入到launchSettingFragment(initialFragmentName, isSubSettings, intent)中,第一次进入到主界面时mIsShowingDashboard是等于true的,会加载一级界面,主界面使用DashboardSummary(Fragment)进行填充。
当点击进入子界面时,子界面则使用各自的Fragment,并设置各自的主题。
Settings模块的数据加载分为一级菜单数据加载和二级菜单数据加载,欲了解详情,可看下一篇文章。