最近一直忙着项目上的活计,没啥心思关注博客,前两天屌丝逆袭,
看了一场你的名字,深深感叹叔叔辈的无奈啊,
青葱憧憬爱情的年华,垂老怀旧相依的岁月,
而我老未及老,幼以过幼,
哎,白瞎了一张电影票。
上回我们基于Android M以前版本的源码,了解并学习了Android M中Settings Menu Tree( PS:主界面)的组织流程,我们知道在Android M及其以前的系统中,Settings界面依赖于自定义ViewGroup来实现,所有item的配置依赖于资源XML文件提供,也就是我们想添加或删除一个主界面的条目,操作XML文件即可(PS:不了解的小伙伴可以前往第一篇中学了解)。而随着Android N(PS:下文中的N 指的均为Android 7.0版本,7.1又有新的更改)的release,关于Settings是否有重大更新呢?
下面让我们一起走进Android N Settings的世界。首先来一张Android N Settings的截图:
在上图中,并不能完整反映Android N Settings界面效果,因此我做了如下处理:
上图中我添加了Suggestions上方的Condition部分,从上图我们可以看出,Settings主界面由Conditions,Suggestions和Main Menu三部分组成,那么这三部分的实现方式是怎样的呢?
学习思路仍然不变,首先找准Manifest文件,查找应用入口(Action Launcher Activity),部分Manifest文件如下图,入口已标示:
通过上图可以看出,整个应用入口仍然是Settings.java
类,打开Settings,java
,摘取部分代码如下:
从上图看出,Settings,java
实际上是一个静态Class 的集合,那么所有的初始化操作自然在其父类实现,追踪继承关系,打开SettingsActivity.java
,查看其onCreate
函数,摘录部分如下:
从上面我们可以看出刚开始主界面是转入DashboardSummary.java
这个Fragment
的界面,继续进入DashBoardSummary.java
,查看其onCreate
函数,部分代码如下:
以上代码就完全可以看出我们的主Menu Tree上的所有列表信息,来源于getDashboardCategries()
这个函数,查看这个函数的声明,发现其位于SettingsDrawerActivity.java
中,详细代码如下:
上图代码阐述了所有列表信息来源于TileUtils类的getCategroies()类,进一步查看该类代码:
我们在这个类的内部深究,会发现,其实所有的列表项都是从AndroidManifest.xml
文件中解析得到的,具体的解析配置会涉及到如下两块:
<meta-data android:name="com.android.settings.category"
android:value="com.android.settings.category.wireless" />
<intent-filter android:priority="4">
<action android:name="com.android.settings.action.SETTINGS" />
</intent-filter>
其中intent-filter
指定在同一组的排序,meta-data
指定属于哪一组。更多详细信息,大家自行查阅代码吧。