您的位置:首页 > 运维架构 > 网站架构

Android N Settings 架构剖析

2018-07-06 09:55 218 查看
Settings N预览 平板项目
Android N 在Settings中作了一些调整,如上面的截图。 - 增加了侧滑菜单,采用v4下的DrawerLayout来实现; - 在Settings主界面增加了Condition,能够在设置列表中显示状态; - 在Settings主界面增加了Suggestion。
设置的代码packages/app/Settingsframeworks/base/packages/SettingsLib设置首页布局显示核心的几个类关系图如下: 备注:1、DashboardSummary:该类为设置选选项页面加载页面。在调用TileUtils类加载categories数据后通过rebuild()方法显示页面。2、TileUtil:该类是通过PM来获取tiles以及categories的数据集合。3、SettingsDrawerActivity:该类为Android N新加的类,用于构建Drawer的布局,是显示在SettingsActivity上面.
Dashboard category数据的加载首先来看下Settings的Dashboard category,dashboard的中文意思指的是仪表板,在Settings中指的是Settings中显示的选项,如WLAN,Bluetooth这样的,参见上面的预览图片。android M中,dashboard的加载是放在SettingsActivity中,而且Settings/res/xml/dashboard_categories.xml这个文件专门用来描述dashboard的整体结构,参见下图。  在Settings N中,则将dashboard这部分的逻辑抽取了出来,放在/frameworks/base/packages/SettingsLib/目录下。N中不再使用dashboard_categories.xml这个文件来描述Settings各选项的架构,而且将Dashboard的初始化放在SettingsLib中来处理,首先看下面的图片:
SettingsLib/src/com/android/settingslib/drawer/TileUtils.java,下面字段为Activity在AndroidManifest.xml中定义tile的字段。 Settings/res/values/donottranslate.xml Name of the meta-data item that should be set in the AndroidManifest.xml to specify the icon、the title、the summary that should be displayed for the preference.先来看看DashboardSummary.java加载的布局 DashboardSummary.java加载的是dashboard.xml布局, dashboard.xml布局是一个focusRecyclerView,这里集成的是一个RecyclerView设置首页列表加载是DashboardSummary.java中的rebuild()方法。 这里通过调用SettingsActivity.java中的getDashboardCategories()方法来获取需要加载的categories,SettingsActivity继承了com.android.settingslib.drawer.SettingsDrawerActivity,getDashboardCategories()方法是在SettingsDrawerActivity中实现的。 在getDashboardCategories()中,会初始化配置信息,并且调用了TileUtils的getCategories()方法,接下来看看该方法的实现: 这里做了很多PM遍历的操作,所以这块是需要优化的 ,这里分别对每个package中的Activity标记遍历,具体标记信息如下图所示:SettingsLib/src/com/android/settingslib/drawer/TileUtils.Java在TileUtils中定义的Actions,用于标记Activity属于哪一个Dashboard category Categories定义在Settings/res/values/donottranslate.xml中,分为四个大的Category,如下代码接下来,看看getTilesForAction()方法实现 在这里,或获取当前用户信息,以及通过PM获取List<ResolveInfo>,如果不是系统应用也不在白名单的第三方应用,会直接跳过遍历,在这里还将传进来的categoryKey赋值,根据categoryKey获取所遍历应用中对应的Tiles,并且会对tiles list进行优先级排序. 这里会返回outTiles.在Android N上的Tile.java等同于Android M上的DashboardTile.java。到这里我们知道如何获取categories list了,然后回到DashboardSummary.java中的rebuild()方法继续解析。 这里讲获取到的categories 传给mAdapter.这个mAdapter是DashboardAdapter类型,DashboardAdapter继承的是RecyclerView.Adapter。前面也提到,DashboardSummary加载的布局外布局就是一个继承了RecyclerView的组件。界面拿到以上数据就可以显示了。Dashboard category 的整体布局 上面这幅图,从上而下分别是 Condition,Suggestion 和各个显示的 Item 项。接下来我们来看这部分在代码中是如何构建的?上面讲到在拿到category以及tile的数据后传给DashboardAdapter.java ,接下来看看DashboardAdapter.java 的构造函数: 构造函数中的setHasStableIds(boolean)表示数据表中每项是否有id唯一识别符,setShowingAll(boolean)是显示dashboard category的接口。接下来看看setShowingAll(boolean)的实现: 这里调用的是recountItems()方法,来看看recountItems()方法实现:
这里会加载多个布局文件,来构造dashboard的布局,方法刚开始就调用了reset(), reset()方法主要是清空了mItems,mTypes,mIds这三个变量,可见接下来又通过调用countItem将各个布局加载上述三个集合中。然后在DashboardAdapter.java中的onBindViewHolder()方法中根据这三个集合的数据加载dashboard的布局,来看看onBindViewHolder()方法的实现:
Settings Drawer 的实现 N 中的 Settings 使用 DrawerLayout 为 Settings 界面加入了侧滑菜单的功能。我们对比下 M 平台和 N 平台的 Settings Activity 的结构就大概明白了。android N 在在 SettingsActivity 上面构建了一个 SettingsDrawerActivity,侧滑的功能则是在 SettingsDrawerActivity 中实现的,SettingsActivity 位于 SettingsLib 下面。接下来我们看看 SettingsDrawerActivity 这个类:  在 SettingsDrawerActivity 的 onCreate 方法中会加载 settings_with_drawer 这个文件。这个文件则是对左侧 Drawer 的布局文件的描述。如下 code: 接着来看左侧 Drawer 的 ListView 的数据是如何加载的,这部分的逻辑由 SettingsDrawerAdapter 来实现。如上截图,在 SettingsDrawerAdapter 的 updateCategories 方法中,添加最上面的 home 的图片和文件后,然后遍历装有 DashboardCategory 的集合,取出里面的 DashboardCategory 和其中的 Tile 存放到对应的集合中去,用于显示到页面上去。Settings 中的 Condition7.0 中的 Settings 加入的 Condition 可以显示设置有些 item 的状态,并且提供快捷开关,在单击后,可以跳转到相应的 Settings 页面。在上文介绍 DashboardCategory 的整体布局的时候,介绍了 Condition 部分加载的文件是 condition_card.xml 文件如上图和 xml 文件相对应,分别表明了各个控件的 id。 看看 Condition 的继承层次:  我们拿 AirplaneModeCondition 来举例,在 Settings 的 AndroidManifest.xml 中注册了如下的 Receiver:
默认情况下这些 Condition 是关闭的,即 enabled 的。在这个 Receiver 中,会去接收这个广播,当 Condition 的状态改变的时候会去更新状态。 Settings 中的 Suggestion,相当于为一些常用的功能界面添加入口,用户通过点击这些建议项可以跳到相应的页面进行操作,并且用户可以手动移除这些建议项。如下面的截图,Suggestion 页面分为两个 suggestion_header.xml 和 suggestion_tile.xml 两个布局组成。关于 Suggestion 的配置信息: Suggestion 默认的数量为 2 个,如上图所示,这个常量的设置是在 DashboardAdapter.java 里面。 另外这些 Suggestion 是以一种顺序来显示的,这个部分的配置是在 suggestion_ordering.xml 中配置的。 这里会通过 SuggestionParser.java 中 new 出来的 SuggestionOrderInflater 来解析这个文件,Suggestion 相关的很多解析操作都是由 SuggestionParser.java 来处理的。在 SuggestionParser 有以下的配置:  这个类中定义的常量会在 Settings 的 AndroidManifest.xml 使用。如上图中定义的 com.android.settings.require_feature 的 meta-data 节点表示该 Suggestion 的显示需要特定的 feature 支持,对于 FingerprintEnrollSuggestionActivity 这个 Suggestion 的显示则需要指纹的支持。另外对于 META_DATA_DISMISS_CONTROL 则控制着当前 Suggestion 的显示时机。正如上面截图的注释描述。 以上就是对于 android7.0Settings 的一些新功能的分析,其实这部分还有很多东西没有详细地去分析,这部分只是做了简单的介绍。,再去看源码的时候,发现 Google 的设计真的是厉害,而且自己很多时候都是从源码的功能去理解,其实从架构,性能方面考虑,源码都是非常优秀的,有很多值得学习的地方。 阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: