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

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


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这个文件里的内容吧,只贴出一点点哈,如下:




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



总结

扫描二维码关注公众号,回复: 190310 查看本文章

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]

猜你喜欢

转载自blog.csdn.net/wzh048503/article/details/79072575