為Android應用添加搜尋功能

來源:互聯網
上載者:User

BKJIA譯文】在本系列共兩篇的教程中,將指導開發人員如何利用Android的 搜尋方塊架進行搜尋功能的開發。在第一篇就是本文中,將讓開發人員瞭解Android的搜尋方塊架,在第二篇教程中,將展示關於搜尋建議和全域搜尋整合到app應用中去。

本地搜尋 VS 全域搜尋

我們先來看下在Android的搜尋方塊架中,本地搜尋和全域搜尋兩個概念和它們之間的區別。

本地搜尋

指的是由app應用本身提供的搜尋功能,這對任何的app應用都應該最好提供這樣的功能,比如一個食譜的app應用應該能讓使用者在這個應用中根據關鍵字去進行搜尋。本地搜尋是在某一app內進行的,不同的app應用之間不能進行互相的搜尋。

全域搜尋

另一方面,全域搜尋能讓使用者在主畫面中通過快速搜尋框根據關鍵字,在各app中展開相關的搜尋,Android使用了多種資料來源來為全域搜尋提供協助。比如中,展示了在Android平板系統中,可以看到左邊部分是使用者輸入的搜尋內容,使用的是google的搜尋,檢索出來的結果中,甚至能包含使用者機器上安裝的app應用的標題,它們展示在右邊。

使用者對於全域搜尋的體驗是跟本地搜尋的是完全不同的。全域搜尋的功能中,可以使用google進行搜尋,搜尋的範圍包括安裝到本地機器的app應用,通訊錄等,甚至包括某些允許使用全域搜尋的app的檢索結果。中,展示的是可以進行全域搜尋的資料來源,可以看到包括了web,各app應用,音樂,訊息和通訊錄。

可以看到,一個好的app應用,應該儘可能在中出現,這樣使用者在搜尋時,才會優先考慮對其進行檢索,更方便使用者的操作。在本教程的第2篇中,將更詳細指導使用者如何去進行全域檢索。

在APP應用中啟用搜尋

在app應用中,至少要執行如下的三個步驟,才能讓app應用能夠進行檢索。如果要提供搜尋建議,還需要執行第4步:

配置搜尋的XML設定檔

首先看下如何配置搜尋的XML設定檔。先命名設定檔名稱為searchable.xml,儲存在res/xml檔案夾中。然後需要設定搜尋方塊的文本,並且應該增加一個hint的提示文本資訊,如下代碼所示:

 
  1. <searchable  
  2. xmlns:android="http://schemas.android.com/apk/res/android" 
  3. android:label="@string/search_label"> 
  4. android:hint="@string/search_hint" 
  5. </searchable> 

關於搜尋設定檔有很多的配置選項,建議參考Android的手冊可以獲得更多:

http://developer.android.com/guide/topics/search/searchable-config.html。

增加搜尋的Activity

當使用者進行搜尋時,Android調用activity進行搜尋,代碼如下:

 
  1. publicclass SampleSearchActivity extends ListActivity { 
  2. public void onCreate(Bundle savedInstanceState) { 
  3. super.onCreate(savedInstanceState); 
  4. handleIntent(getIntent()); 
  5. }
  6. public void onCreate(Bundle savedInstanceState) {  
  7. super.onCreate(savedInstanceState);  
  8. handleIntent(getIntent());  
  9. }  
  10. public void onNewIntent(Intent intent) {  
  11. setIntent(intent);  
  12. handleIntent(intent);  
  13. }  
  14. public void onListItemClick(ListView l,  
  15. View v, int position, long id) {  
  16. // 點每個搜尋結果時的處理代碼  
  17. }  
  18. private void handleIntent(Intent intent) {  
  19. if (Intent.ACTION_SEARCH.equals(intent.getAction())) {  
  20. String query =  
  21. intent.getStringExtra(SearchManager.QUERY);  
  22. doSearch(query);  
  23. }  
  24. }  
  25. private void doSearch(String queryStr) {  
  26. //執行真正的查詢結果處理  
  27. }  

在上面的代碼中,在handleIntent方法中,當按下搜尋按鈕,系統就會自動發送Intent,action是Intent.ACTION_SEARCH,然後通過intent.getStringExtra(SearchManager.QUERY);獲得要搜尋的字串。

其中為什麼要包含onNewIntent()方法呢?主要是因為Android的back後退機制。Android會預設把每一個新的activity放到activity棧的頂部。如果使用者點了後退鍵,則會關閉棧頂部的activity。嘗試考慮一種情況,使用者搜尋一個內容並且系統列出了結果,如果使用者發現結果不是他所要的,或者希望重新檢索,則會重新點擊搜尋按鍵,這樣將會產生一個新的搜尋activity的執行個體,在activity棧中就會有兩個搜尋的activity,這是開發人員並不期待的,所以,需要將這個搜尋的activity聲明為singleTop類型的activity,這樣的話,無論使用者按返回鍵還是盡心個多次的搜尋,在acitivty棧中始終保持的是一個搜尋activity的執行個體。因為當activity被設定為singleTop的載入模式時,如果堆棧的頂部已經存在了該Activity,那麼,它便不會重新建立,而是調用onNewIntent。如果,該Activity存在,但不是在頂部,那麼該Activity依然要重新建立。

mainifest設定檔

接下來,需要對manifest設定檔進行配置,必須要對其中進行如下配置:

  • 搜尋的activity.
  • 使用搜尋的intent
  • activity啟動模式
  • searchable.xml中的中繼資料
  • 更多的定義搜尋的中繼資料

下面是典型的一個搜尋的配置

 
  1. <application 
  2. android:icon="@drawable/icon" 
  3. android:label="@string/app_name" 
  4. android:name=".YourApp" > 
  5. <meta-data 
  6. android:name="android.app.default_searchable" 
  7. android:value=".YourSearchActivity" /> 
  8. <activity 
  9. android:label="@string/app_name" 
  10. android:launchMode="singleTop" 
  11. android:name=".YourSearchActivity" > 
  12. <intent-filter > 
  13. <action android:name="android.intent.action.SEARCH" /> 
  14. </intent-filter> 
  15. <intent-filter > 
  16. <action android:name="android.intent.action.VIEW" /> 
  17. </intent-filter> 
  18. <meta-data 
  19. android:name="android.app.searchable" 
  20. android:resource="@xml/searchable" /> 
  21. </activity> 
  22. </application> 

在上面的典型配置中,要注意如下幾點:

1)由於當調用搜尋activity時,Android調用的是android.intent.action.SEARCH作為搜尋的intent,所以必須在intent-filter中包含android.intent.action.SEARCH。

2)在<meta-data>中,指出了searchable.xml的位置

3)同樣在<meta-data>中,通過:

 
  1. <meta-data 
  2. android:name="android.app.default_searchable" 
  3. android:value=".YourSearchActivity" /> 

指出了當執行搜尋的字串提交時,將調用哪一個activity去進行處理。

自訂搜尋

對於app應用來說,最好的還是能自訂搜尋功能,並且能清晰告訴使用者:你的app應用能支援搜尋。

要注意的是,在Android的Honeycomb 和Ice Cream Sndewich版本中,已經不再有一個搜尋的按鈕了。取而代之的是在action bar中顯示搜尋的按鈕。因此,一種很好的方式是通過在actionbar中同時加入搜尋按鈕,好像如,是在Android 2.2上啟動並執行效果。

當使用者開始搜尋時,在activity中要開啟一個搜尋的對話方塊,這可以通過調用onSearchRequested()實現,這個是Android中Activity類的方法,並且會調用startsearch()方法,這個接下來會討論。

在搜尋中加入指定資料

預設的搜尋有時不能滿足需要,可能要需要使用全域搜尋,也可能需要一些額外的資料,在這個情況下,可以重寫onSearchRequestd()方法並且自己調用startSearch方法,其中startSearch的方法中定義的參數如下:

參數

類型

含義

initialQuery

string

搜尋方塊中預設的字串

selectInitialQuery

boolean

這個標誌表明搜尋方塊中的內容是否可以被選擇,如果設定為true,則會覆蓋initialQuery

appSearchData

Bundle

其他傳遞到搜尋activity中的資料

globalSearch

boolean

決定是否使用全域搜尋

在預設調用startSearch()方法時,會預設使用如下的值:null, false, null, false,其含義為只使用本地搜尋,不附加任何的其他的值。

讓APP應用支援語音搜尋

如果讓APP應用支援使用者使用語音進行搜尋,那對使用者來說就更方便了!在Android中,這隻需要增加一些代碼就可以實現了。是當使用了語音設定後,Android會出現一個麥克風,讓使用者使用語音。

但要注意,不是所有的裝置都支援語音搜尋的,要使用語音搜尋,需要設定配置選項如下:

 
  1. android:voiceSearchMode= 
  2. "showVoiceSearchButton|launchRecognizer" 

其中voiceSearchMode有兩個選項,showVoiceSearchButton和launchRecognizer,其中showVoiceSearchButton是必須的,建議使用launchRecognizer這個選項。而另外一個重要的選項是android:voiceLanguageModel,它有兩個選項分別是:web_search和free_form,最好建議使用者使用web_search,意思是使用語言模型在Web上搜尋,這很適合使用者不是很準確朗讀短語句子的情景,而free_form選項則適合比如在一些應用中如SMS或郵件中使用。還要注意的是,使用語音檢索,必須要在連網的環境下使用。

小結

本文介紹了Android搜尋的基本架構的使用,也介紹了語音搜尋中要注意的問題,在下一篇教程中,將介紹如何為搜尋添加自動提示協助,以及如何讓你的APP在Android的搜尋菜單中出現。敬請期待BKJIA下篇譯文吧。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.