Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android Quick Search in Settings,androidquick

Android Quick Search in Settings,androidquick

編輯:關於android開發

Android Quick Search in Settings,androidquick


歡迎大家加入群裡交流: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變量後,我們得到它的兩個方法返回值,根據返回值的具體內容,我們將其更新到數據庫。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved