Search (搜索)是Android平臺的一個核心功能之一,用戶能夠在手機搜索在線的或是本地的信息。Android平臺爲全部須要提供搜索或是查詢功能的應用提 供了一個統一的Search Framework來幫助實現Search功能。Search Framework的UI能夠有兩種形式:android
無論採用那種UI,Android系統均可以經過向某個指定Activity發送須要查詢的內容來幫助應用實現查詢功能。同時Android也支持查詢提示,以下圖所示:api
除此以外,Android查詢UI能夠支持:app
Invoke Search介紹瞭如何使用Search Framework 並採用Search dialog 的方式在屏幕頂部顯示查詢條。下面結合例子介紹使用Search Framework的通常步驟:ide
Create a Search Interfaceui
例採用屏幕頂部Search Dialog的方式。在這種方式下,Android操做系統接管全部Search Dialog的事件,當用戶提交查詢後,Android系統將給支持的用來處理查詢的Activity發送消息。Search Dialog能夠提供查詢提示列表來匹配用戶輸入。this
用戶提交查詢後,Android系統構造一個Intent並把用戶的查詢內容放在這個Intent中。而後Android啓動你定義的用來處理用戶查詢的 Activity(稱爲Searchable Activity),並把這個Intent發給該Activity。爲了可以使用Android系統提供的Search Framework.須要如下幾步:spa
1. Creating a Searchable Configuration操作系統
首先定義一個Searchable configuration,用於描述Search Dialog 的一些屬性,該描述文件按慣例一般命名爲searchable.xml 並定義在/res/xml 目錄下:code
<!-- The attributes in this XML file provide configuration information --> <!-- for the Search Manager. --> <searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint" android:voiceSearchMode="showVoiceSearchButton|launchRecognizer" android:voiceLanguageModel="free_form" android:voicePromptText="@string/search_invoke" android:searchSuggestAuthority="com.example.android.apis.SuggestionProvider" android:searchSuggestSelection=" ? " />
只有android:label是必須的,通常定義爲應用程序的名稱。儘管不是必須的,通常也會定義android:hint。這個屬性定義查詢框沒有任 何輸入時的背景文字。如上圖中的」Search the dictionary」 。本例中爲「Search Demo Hint」來提示用戶能夠輸入的內容。orm
2. Creating a Searchable Activity
一個」Searchable Activity」就是一個能夠用來處理Search Query 的Activity。和通常的Activity沒有太大分別。當用戶提交查詢後,Android會給這個「Searchable Activity」發送一個Intent包含有用戶查詢內容,同時這個Intent 含有ACTION_SEARCH action。
因爲能夠在任何一個Activity中使用Search Dialog或是SearchView,Android須要知道哪一個Activity是「Searchable Activity」,這就須要在AndroidManifest.xml中來定義「Searchable Activity」。
本例中 SearchQueryResults 定義爲「Searchable Activity」,它在AndroidManifest.xml中定義爲:
<!-- This activity represents the "search" activity in your application, in which --> <!-- search results are gathered and displayed. --> <activity android:name=".app.SearchQueryResults" android:label="@string/search_query_results"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> <!-- This intent-filter identifies this activity as "searchable" --> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> <!-- This metadata entry provides further configuration details for searches --> <!-- that are handled by this activity. --> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity>
Searchable Activity 須要在Intent-filter中指定android.intent.action.SEARCH,並在<meta-data>部分指定 searchable configuration (指向res/xml/searchable.xml)
SearchQueryResults 用來處理用戶查詢請求,本例爲簡單起見,只是在屏幕上顯示用戶查詢請求的內容。
它用來處理查詢請求Intent的代碼以下:
if (Intent.ACTION_SEARCH.equals(queryAction)) { doSearchQuery(queryIntent, "onNewIntent()"); } else { mDeliveredByText.setText("onNewIntent(), but no ACTION_SEARCH intent"); }
若是請求的Action爲ACTION_SEARCH,代表該Activity是由Search Dialog觸發的,則調用doSearchQuery來顯示用戶查詢內容。此外這個Activity也能夠從Launcher啓動,此時Action不 含ACTION_SEARCH。
Using the Search Dialog
Search Dialog 先爲屏幕上方的浮動窗口,缺省爲不可見的。只有當調用onSearchRequested()或是用戶按「Search」鍵時(不是全部設備都有Search鈕,在模擬器上能夠用F5)Search Dialog纔會顯示。
爲了使用Search Dialog,咱們在AndroidManifest.xml定義了Searchable Activity: SearchQueryResults。 若是此時直接運行SearchQueryResults,在模擬器上按F5,將會在屏幕上方顯示Search Dialog。
若是如今Invoke Search (SearchInvoke)Activity也可使用Search Dialog, 也須要在AndroidManifest.xml作些說明:
<activity android:name=".app.SearchInvoke" android:label="@string/search_invoke"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.SAMPLE_CODE" /> </intent-filter> <!-- This metadata entry causes .app.SearchQueryResults to be the default context --> <!-- whenever the user invokes search while in this Activity. --> <meta-data android:name="android.app.default_searchable" android:value=".app.SearchQueryResults" /> <!-- This is not the typical way to define android.app.default_searchable, --> <!-- and we show it here only because we wish to confine the search demo to this --> <!-- section of the ApiDemos application. --> <!-- For typical applications, it's simpler to define android.app.default_searchable --> <!-- just once, at the application level, where it serves as a default for all of --> <!-- the Activities in your package. --> </activity>
這時按下 onSearchRequest() 或是 「Search」鍵就顯示Search Dialog,按查詢鍵後,將會在SearchQueryResults顯示用戶輸入的查詢內容:
此外咱們看到這Search Dialog下提供了最近用戶輸入做爲輸入提示,若是裏面含有敏感信息,能夠清除這個列表。
private void clearSearchHistory() { SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, SearchSuggestionSampleProvider.AUTHORITY, SearchSuggestionSampleProvider.MODE); suggestions.clearHistory(); }