【推荐下载】Android N Settings模块与Android M Settings模块差异 下载本文

内容发布更新时间 : 2024/5/22 11:18:32星期一 下面是文章的全部内容请认真阅读。

Android N Settings 模块与 Android M Settings 模块差异

2016/11/03 8302 Android N Settings 与之前的 Android 版本 Settings 模块在 UI 上右较大的改变,最直观的差异在于 Android N 设置界面增加了向右滑动的抽屉效 果。

先回想下 android M 设置的主界面时怎么显示和交互的?

android M 设置的主界面是定义在 res/xml/dashboard_categories.xml 这个文件中, 其 SettingsActivity.java 继承与 Activity,在其 onCreate 方法中,通过

mIsShowingDashboard 变量,控制加载不同的布局 R.layout.settings_main_dashboard 或者 R.layout.settings_main_prefs(Settings 的主界面或者二级三级菜单),

mIsShowingDashboard Boolear 类型的变量是直接判断当前要启动的 Activity 的类是 不是 Settings.class,因为 Settings 这个类才是 Settings 的入口类。若是加载 Settings 的主界面,则是加载 R.layout.settings_main_dashboard 布局,这个布局里面仅仅只是 一个 FrameLayout 的 ViewContainer。

SettingsActivity.java 中 buildDashboardCategories()-

categories,

this)

loadCategoriesFromResource(R.xml.dashboard_categories, -

updateTilesList()去解析这个布局文件,动态添加或删除一级菜单的 item,然后将 主界面加载到 FrameLayout 的 ViewContainer 中,这样一级菜单就显示出来了。 对于二级菜单,在设置模块中有一个 Settings.java 的类,该类中定义了许多直接 继承与 SettingsActivity 的空实现 Activity,如果细心点还会发现,这些空实现的 Activity 在 AndroidMainifest.xml 中都有 meta-data/ 属性,这是为什么呢?原因很简 单,上面说过,既然这些 Activity 都是继承与 SettingsActivity,那么要启动这些 Activity 时必然会走 SettingsActivity 中 onCreate()方法,刚在还提到 SettingsActivity 中 onCreate()方法是需要加载一级菜单还是加载二级菜单,取决于

mIsShowingDashboard 变量,而现在要确定加载的是二级菜单的具体哪个菜单?则 需要用到 AndroidMainifest.xml 中声明该 Activity 时定义的 meta-data/ 属性。

当然,并不是所有的设置项都是这样,例如若要在 Settings 中添加一个选项,跳 转到其他应用中,那么也可以直接在 dashboard_categories.xml 中添加相应的 item, 直接用 intent 跳转过去也时可以的。

那么,Android N 中的设置主界面又时怎么显示和交互的呢?

Android N 在代码架构上和 Android M 最大的区别是 Android N 设置代码分为了 两部分,一部分是在 packages/apps/Settings,另一部分是在 frameworks/base/packages/SettingsLib。

Android N Settings 增加了向右滑动的抽屉效果,即无论在一级二级还是三级菜单 界面下,只要向右滑动就可以调出 Settings 的主界面(事实上是无论哪一级菜单,只 要改级菜单继承了 SettingsActivity,那么就可以向右滑动调出设置的主界面)。接下 来分析 Android N Settings 的启动流程。

先看设置的入口类,Settings.java,该类和之前一样,没什么变化,一样继承与

SettingsActivity.java,内部也定义了很多空实现的内部类,空 Activity 继承与 SettingsActivity。那么应该和 android

M 一样,真正的入口还是在 SettingsActivity

中。直接看 SettingsActivity 类,发现 SettingsActivity 不再是继承与 Activity 类,而 是继承与 rameworks/base/packages/SettingsLib 下面的 SettingsDrawerActivity,看一 下 SettingsDrawerActivity 是什么鬼??

SettingsDrawerActivity 从名字来看,好像和实现滑动效果有关,到该类一看究

竟,发现它加载的布局时 settings_with_drawer.xml,这个布局中用到

android.support.v4.widget.DrawerLayout,DrawerLayout 布局就具有左右滑动的抽屉 效果。在看 settings_with_drawer.xml 布局中有一个 listView 控件,猜想该控件就是 用来显示抽屉布局中的设置的主界面(后面在分析)。

继续看 SettingsActivity 的 onCreate 方法,其加载布局的地方和之前没什么区

别,可是却发现有区别的地方在从 DashboardSummary.class 中的获取要加载 item 的 数据部分,DashboardSummary.java 的 rebuildUI()中,调用了 SettingsDrawerActivity

的 getDashboardCategories()获取数据。也就是说在设置中主界面上要显示那些选项 也是 rameworks/base/packages/SettingsLib 中的 SettingsDrawerActivity 的 getDashboardCategories()获取来的,而不是像 Android

M 一样将布局定义在

res/xml/dashboard_categories.xml,现在在 Settings 模块下面已经没有了 dashboard_categories.xml 文件,那么数据到底是怎么获取出来的呢?

现在来分析 SettingsDrawerActivity 类,在 SettingsDrawerActivity 的 onCreate 方

法中,如上面提到,它加载的布局是 settings_with_drawer.xml,它是外层是 DrawerLayout,因此能左右滑动(可自行百度 DrawerLayout 用法),该布局中有 listView,这个 listView 就是我们左右滑动看到的 DrawerLayout 的主界面,listView 的 Adapter 是 SettingsDrawerAdapter 的实例,SettingsDrawerAdapter 继承于 BaseAdapter,SettingsDrawerActivity 中通过 getDashboardCategories() TileUtils.getCategories(this, DashboardCategory 类型。

再来看 TileUtils 类的 getCategories()是如何返回 DashboardCategory 对象的 List 的?先看代码:

getCategories()方法差不多可分为三步:

1.先调用 getTilesForAction() - getTilesForInten()从 AndroidMainifast.xml 中声明 的 activity 信息中解析,并将解析的数据以 Tile 类型数据结构封装。

2,遍历存储所有 Tile 的集合,将通过 tile.category 属性,将其分类,并构建成 category,并将 category 存储在对应的 categoryMap 中。

3.构建 categories,并且排序,排序是按照 DashboardCategory 的 priority 排序的。 先看一下 Title 数据类型,它里面封装的每一个变量都是和 AndroidMainifast.xml 中声明 Activity 时 meta-data/ 标签一一对应的。

sTileCache),获取的数据,它将数据也是封装成