Settings N预览 平板项目
Android N 在Settings中作了一些调整,如上面的截图。  - 增加了侧滑菜单,采用v4下的DrawerLayout来实现;  - 在Settings主界面增加了Condition,能够在设置列表中显示状态;  - 在Settings主界面增加了Suggestion。
设置的代码 packages/app/Settings frameworks/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,如果不是系统应用也不在白名单的第三方应用,会直接跳过遍历,在这里还将传进来的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 中的 Condition 7.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 的设计真的是厉害,而且自己很多时候都是从源码的功能去理解,其实从架构,性能方面考虑,源码都是非常优秀的,有很多值得学习的地方。

更多相关文章

  1. Android(安卓)四大组件流程、Handler、AsyncTask、IntentService
  2. Android(安卓)插件化分析(3)- Activity启动流程
  3. Android理解:IntentService
  4. 使用 Eclipse 调试 android 程序(debug 方法)
  5. 个人android工具包——androidkit更新
  6. Android中AppWidget加载流程(二)
  7. Android(安卓)Activity 淡入淡出和从底部向上弹出动画效果【转】
  8. Android(安卓)x86模拟器Intel Atom x86 System Image配置与使用
  9. 实现仿windows正在加载loading动画

随机推荐

  1. android TextView的字体颜色设置的多种方
  2. Android(安卓)Layout机制研究
  3. 把应用跑在android上
  4. ToggleButton自定义View学习
  5. Android横向的选项卡
  6. Android(安卓)中文 SDK —— ADT 14.0.0
  7. Android(ViewPager中的ViewPager)ViewPager
  8. Android探索之旅(第三十二篇)Android(安卓)
  9. Android(安卓)图形系统剖析
  10. 【Android】数据存储之Network