欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android5.1的系统Settings主界面UI显示流程源码分析

程序员文章站 2022-05-23 20:27:42
...

本人是做车机的,所以系统设置是会经常需要修改的,刚开始也是一脸无助,后来查找资料,仔细阅读后,基本也能应付工作内容了,现在将它记录一下,怕自己忘了,也以供大家参考,文笔不好请原谅


5.1系统设置应用的主界面是Settings.java,它继承自SettingsActivity.java,而SettingsActivity继承自Activity,所以设置主界面本质还是一个Activity;首先从父类SettingsActivity的onCreate()方法开始看,来到setContentView(mIsShowingDashboard?R.layout.settings_main_dashboard : R.layout.settings_main_prefs),因为mIsShowingDashboard为true,所以加载的布局文件是R.layout.settings_main_dashboard,该布局文件在ndroid\packages\apps\Settings\res\layout位置,代码如下:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             android:id="@+id/main_content"
             android:layout_height="match_parent"
             android:layout_width="match_parent"
             android:background="@color/dashboard_background_color"
             />
接着我们来到switchToFragment(DashboardSummary.class.getName(),null,false,false,mInitialTitleResId, mInitialTitle, false)这行代码,为什么来到这里呢?也是因为mIsShowingDashboard为true的缘故,通过这行代码就切换到了DashboardSummary.java这个Fragment,DashboardSummary.java这个类在android\packages\apps\Settings\src\com\android\settings\dashboard\目录下,既然DashboardSummary.java是个Fragment,那么我们直接看onCreateView()方法,这个方法加载了一个R.layout.dashboard布局,代码如下:

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/dashboard"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbarStyle="outsideOverlay"
    android:clipToPadding="false">
            <LinearLayout
                android:id="@+id/dashboard_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_gravity="center_horizontal"
                android:paddingStart="@dimen/dashboard_padding_start"
android:paddingEnd="@dimen/dashboard_padding_end"
                android:paddingTop="@dimen/dashboard_padding_top"
                android:paddingBottom="@dimen/dashboard_padding_bottom"
                android:orientation="vertical"
                />

</ScrollView>


可以看出Settings主界面的所有那些类似蓝牙,wifi的条目都是在id为@+id/dashboard_container这个LinearLayout中,走完
onCreateView()方法,接着就是来到onResume()方法中,在该方法中调用了sendRebuildUI()方法,该方法中通过Handler对象发送了一个MSG_REBUILD_UI的消息,Handler接收到该消息便调用了rebuildUI(context),该rebuildUI()方法就是初始化所有Settings主界面能看到的文字和小图标的显示.我们接着看List<DashboardCategory> categories =((SettingsActivity) 
context).getDashboardCategories(true)这行代码,可以知道getDashboardCategories(true)方法是属于SettingsActivity类中的方法,否则为什么强转呢是吧?接着我们回到SettingsActivity类中的getDashboardCategories()方法,该方法调用了buildDashboardCategories(mCategories)方法,该方法又调用了loadCategoriesFromResource(R.xml.dashboard_categories, categories)方法,该方法通过Xml解析了一个R.xml.dashboard_categories的布局文件,该xml布局文件位置在android\packages\apps\Settings\res\xml\目录下,你打开看一下这个xml文件就明白这里面是什么东西了,肯定有豁然开
朗的感觉!解析完就通过getDashboardCategories()方法返回一个List<DashboardCategory>类型的集合对象到DashboardSummary.java类中去了,注意getDashboardCategories()是上面之前提到过DashboardSummary.java类中的方法,正是调用了这个方法才会跳转到SettingsActivity类去追踪代码,现在追踪完了肯定得回到最初的调用的地方去.我们接着回到DashboardSummary.java类中的rebuidUI()中去,后面的代码就是通过两个嵌套的for循环将所有子视图显示出来,两个for循环里还出现了DashboardCategory和DashboardTile.java这两个类,大家可以自己去看看这两个类,我没怎么看.再说说为什么是两个嵌套for循环?因为getDashboardCategories()方法返回的是List<DashboardCategory>类型的集合,泛型类型DashboardCategory类其实也是个大模块,可以理解是个容器,它里面还有子视图,举个例子:[无线和网络]大模块下有wifi,蓝牙等子模块,[设备]大模块下有显示,存储,应用等子模块,[个人]大模块下有位置信息,安全,账户,语言和输入法等子模块,所以是两个嵌套的for循环去初始化所有的子视图;我们现在再来说说R.xml.dashboard_categories.xml这个文件里的内容吧,之前卖了一个关子,没仔细说,主要是想先把源代码追踪完再来说xml布局文件;在这个dashboard_categories.xml文件中有dashboard-categories节点,它是个总容器,它下面有dashboard-category节点,dashboard-category也是个容器,它对应DashboardCategory.java类,它下面还有dashboard-title节点,它对应DashboardTile.java类,还记得上面提到的两个嵌套的for循环里出现了两个类吗?没错,就是对应那两个类,dashboard-title节点才是具体模块的显示效果,例如WLAN和蓝牙条目子模块,dashboard-title节点还有id,icon,title,fragment等属性,点击就跳转到对应的全类名的fragment;点击事件是在DashBoardTitleView类中实现的,在构造里设置的点击事件监听,在DashBoardSummary类中的rebuildUI()方法中通过嵌套的两个for循环里的第二个for循环遍历new出每个DashBoardTitleView对象,至此,Settings主界面的UI显示流程就分析完了;说了这么多,看下R.xml.dashboard_categories.xml这个文件里的内容吧,只贴出一点点哈,如下:

Android5.1的系统Settings主界面UI显示流程源码分析


------------------------------------------------//-----------------------------------



总结

1. 大家熟悉了Settings主界面的UI显示流程,那么在工作中遇到修改的需求就不会那么头疼了,做车机的同学肯定会遇到   这种需求,没人带着看系统源码是很痛苦的,还看不懂,我也是看了别人的资料才能慢慢看懂的,以此感谢分享的大神们

2. 特此说明一下,以上代码只是Android5.1平台的系统Settings源码,其他平台的源码和文件位置可能不同,需注意

3. 其实上面说得就是Settings主界面的UI显示流程,它其实就是一个Activity,然后装了一个DashboardSummary.java这     个Fragment,仅此而已

4. 以上内容提到的文件按顺序如下:以便大家自己追踪代码

[SettingsActivity.java]  [settings_main_dashboard.xml] [DashboardSummary.java] [dashboard.xml] 

[dashboard_categories.xml] [DashboardCategory.java] [DashboardTile.java] [DashboardTileView.java]

相关标签: Android Settings