分析Android 11.0Settings源码之主界面加载
本篇主要记录androidr settings源码主界面加载流程,方便后续工作调试其流程。
settings代码路径:
packages/app/settings/
settings代码获取:
setting 源码下载地址:https://github.com/aosp-mirror/platform_packages_apps_settings
git地址:https://github.com/aosp-mirror/platform_packages_apps_settings.git
主界面加载:
首先我们来看 settings 模块中的 androidmanifest.xml 文件,找到默认启动入口activity信息:
可以看到settings的桌面图标启动的主界面是settings.java,但其xml定义了targetactivity属性,实质应是settingshomepageactivity.java,从oncreate()方法开始:
可以看到主界面的layout为settings_homepage_container.xml:
主界面布局中主要包含两部分:一个顶部快捷搜索栏,一个id为main_content的framelayout就是用来显示主设置内容的,即settings的一级菜单项界面。
回到oncreate()方法:
可以看到一级菜单启动的是toplevelsettings,toplevelsettings继承于dashboardfragment.java:
toplevelsettings的构造方法:
可以看到通过构造方法传递了一个参数,从注释中可以看出,该参数的用意是由于主界面使用完整的搜索视图所以在主界面的actionbar中隐藏了搜索图标。然后再根据framgments生命周期先来看onattach()方法:
调用父类dashboardfragment.java的onattach()方法:
通过方法注释可以得知此方法主要是完成preference controllers的加载。
dashboardfragment.java的oncreate()方法:
设置comparisoncallback,以便在列表更改时获得更好的动画效果。
第一次进入时,icicle为null,根据log定位发现,其后调用dashboardfragment.java的oncreatepreferences()方法:
调用refreshallpreferences():
刷新所有preference items,包括来自xml的静态preference和来自dashboardcategory的动态preference,静态xml定义的prefs(调用displayresourcetiles()方法),动态dashboardcategory动态加载(调用refreshdashboardtiles(tag)方法,其中tag为 “toplevelsettings”)。
displayresourcetiles():此方法主要是从xml资源文件中加载显示prefs:
静态加载
首先调用getpreferencescreenresid()方法获取所要加载的xml的id,然后调用子类toplevelsettings.java的getpreferencescreenresid()方法:
可以看到settings主界面加载的xml文件是top_level_settings:
可以看到主要配置的是一些preference菜单项如网络和互联网、已连接的设备、应用和通知、电池等等,preference的配置含义:
- key:唯一性id;
- title:标题;
- summary:简介;
- ico:图标;
- order:加载显示优先级,order为负时,绝对值越高,界面显示越靠前;order为正时,值越高,显示越靠后;
- fragment:点击此preference所跳转的fragment界面;
- controller:控制管理类。
动态加载
refreshdashboardtiles
总结:
- settings的主activity实质实现是在settingshomepageactivity.java内;
- settings的主界面设置item的显示是在fragment上,fragment为toplevelsettings.java,加载显示的布局为top_level_settings.xml;
- settings主界面设置项item的加载显示主要分为两部分,一部分是xml定义的静态加载,xml为top_level_settings.xml;一部分是dashboardcategory来获取动态加载;
- 每个设置项item均为一个preference,通过xml定义加载时,必须要有一个controller,可以是在xml中定义"settings:controller"属性声明,名称必须与类的包名路径相同;也可直接在相关fragment中实现createpreferencecontrollers()方法去调用构造相关controller。此二者存其一即可。
- xml中配置preference时,必须定义”android:key“属性;
以上就是分析android 11.0settings源码之主界面加载的详细内容,更多关于android 11.0settings源码的资料请关注其它相关文章!