最近一直忙着項目上的活計,沒啥心思關注博客,前兩天屌絲逆襲,
看了一場你的名字,深深感嘆叔叔輩的無奈啊,
青蔥憧憬愛情的年華,垂老懷舊相依的歲月,
而我老未及老,幼以過幼,
哎,白瞎了一張電影票。
上回我們基於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
指定屬於哪一組。更多詳細信息,大家自行查閱代碼吧。