編輯:關於android開發
歡迎大家加入群裡交流:429664282
基於:android-6.0.1_r17 f4b8ad6
Android Settings中存在一個SearchIndexablesProvider,它提供了可供快速檢索的設置項。通過它,我們可以決定哪些系統設置可以被快速檢索,那些可以不被檢索。
SearchIndexablesProvider簡介
SearchIndexablesProvider是Android標准API,在SDK中可以找到,路徑是"android.provider.SearchIndexablesProvider"。它是一個虛基類,提供了一些抽象方法和常用方法。
抽象方法如下:
Cursor queryXmlResources(String[])
Cursor queryRawData(String[])
Cursor queryNonIndexableKeys(String[])
queryXmlResources方法返回一個Cursor,這個Cursor中包含了所有可以被索引的XmlResource,方法的參數是個String數組,用來表示傳入查詢的列。
queryRawData方法同queryRawData很類似,唯一區別是返回所有可以被索引的RawData。
queryNonIndexableKeys返回所有可以不被所有的NonIndexableKey。
檢索數據來源:SearchIndexableResources
在Settings中,所有可供檢索的數據資源,均被定義在SearchIndexableResources類中。
例如,Wifi設置頁面的所有可供檢索的數據,都通過WifiSettings.java提供。
1 static { 2 3 sResMap.put(WifiSettings.class.getName(), 4 5 new SearchIndexableResource( 6 7 Ranking.getRankForClassName(WifiSettings.class.getName()), 8 9 NO_DATA_RES_ID, 10 11 WifiSettings.class.getName(), 12 13 R.drawable.ic_settings_wireless));
特殊檢索數據:Indexable
在Settings中,提供了一類特殊的檢索數據,那就是實現了Indexable接口的類。
Indexable是定義在Settings內部的一種檢索資源,通過代碼的方式,返回可供檢索的數據,包括SearchIndexableResource和SearchIndexRaw。
所有實現了Indexable的類,必須提供一個public static的SEARCH_INDEX_DATA_PROVIDER變量,用來供Settings利用反射獲取到相應的檢索數據。
檢索數據提供者:SettingsSearchIndexablesProvider
在Settings中,SettingsSearchIndexablesProvider實現了SearchIndexablesProvider,並且提供了可供檢索的數據資源。這個數據資源以靜態map的方式定義在SearchIndexableResources中,並且在queryXmlResources方法中返回給數據請求者。
Settings並未提供任何的RawData和NonIndexableKey,所以它的queryRawData返回了一個空的Cursor。
更新檢索數據庫
在每次打開Settings導航頁面的時候,Index.update()方法都會被調用,用來更新檢索數據。
Step1. 獲取所有SearchIndexablesProvider.
Step2. 添加可供檢索的數據到緩存:addIndexablesFromRemoteProvider
對於每一個SearchIndexablesProvider,都需要進行這個操作。
Step2.1. 從XmlResource中添加檢索數據:addIndexablesForXmlResourceUri
所有定義在SearchIndexableResources中的檢索數據,均會在這一步中被添加進來。接下來,讓我們看看具體實現:
Step2.1.1 獲取檢索數據的Cursor
Step2.1.2 創建SearchIndexableResource,並加入到更新數據的緩存列表:
Step2.2. 從RawData中添加檢索數據:addIndexablesForRawDataUri
Settings並未提供任何RawData,所以我們可以忽略這個步驟。
Step3. 添加不可供檢索的數據到緩存
Settings並未提供任何NonIndexableKey,所以我們可以忽略這個步驟。
Step4. 更新緩存的檢索數據
更新緩存的檢索數據在updateInternal()方法中實現,下面我們來逐步分析下。
緩存數據結構
到現在為止,Settings提供的檢索數據均被添加到"dataToUpdate"列表中。其他兩個未包含任何Settings提供的檢索數據。
Step4.1 創建一個UpdateIndexTask的後台任務來更新檢索數據庫
我們下面只關心dataToUpdate的相關操作。
Step4.2 更新dataToUpdate緩存:processDataToUpdate
在這個方法中,我們對每一個SearchIndexableData都使用indexOneSearchIndexableData方進行更新。
Step4.3 對檢索數據進行索引:indexOneSearchIndexableData
這裡的檢索數據可以包括RawData和XmlResource,又或者Settings返回的SearchIndexableResource。
這裡為什麼是SearchIndexableResource?因為SettingsSearchIndexablesProvider把所有可以檢索的數據都已SearchIndexableResource插入到Cursor中,並且返回給數據查詢者,這裡也就是Settings本身。
Step4.4 對每一條檢索數據資源進行數據檢索:indexOneResource
前面我們提到過,Settings裡面有一種特殊的檢索數據資源:Indexable。
在這裡,如果我們發現這條檢索數據資源的xmlResId是NO_DATA_RES_ID,也就是說,當前這個檢索數據資源是一條特殊的檢索數據資源。我們就需要利用反射機制得到它的pusblic static的SEARCH_INDEX_DATA_PROVIDER。
Step4.4.1. 處理普通的檢索數據資源:xmlResId != NO_DATA_RES_ID
Step4.4.1.1. 從XML中解析檢索數據:indexFromResource
在這裡就到了整個實現流程的最末端了,解析整個PreferenceScreen的XMl文件,並且把每一個符合條件的項加入到檢索數據庫。
Step4.4.2. 處理特殊的檢索數據資源:Indexable
Step4.4.2.1. 從特殊的檢索數據源獲取檢索數據:indexFromProvider
當拿到SEARCH_INDEX_DATA_PROVIDER變量後,我們得到它的兩個方法返回值,根據返回值的具體內容,我們將其更新到數據庫。
使用Eclipse開發Android源碼 1.把eclipse工程配置文件復制到Android源碼根目錄下 cp development/ide/eclipse/.c
安卓開發與分析者的利器--安卓右鍵工具 安卓右鍵工具,集成dex轉jar,二進制xml查看,apk相關信息查詢,apk圖標提取,apk優化,手機屏幕截圖,安裝卸載,簽
Android開發自學筆記—1.1(番外)AndroidStudio常用功能介紹,androidstudio自學一、界面區介紹 1、項目組織結構區,用於浏覽項目文件,默
Material Design:CollapsingToolbarLayout,materialdesign activity_main.xml: <