现在的位置: 首页 > 综合 > 正文

认知 android.app.SearchManager

2013年01月02日 ⁄ 综合 ⁄ 共 2028字 ⁄ 字号 评论关闭

在看到《Interducing Quick Search Box for Androi d》一文之前,我从没有想到过把应用和系统搜索服务联系起来。看过 Android-developers 的博文之后,惊讶原来 Android 提供了这么好的搜索机制,于是立即打开 SearchManager 的文档来补回这一课。文档共分了9个部分来介绍,在这里我也按图索骥,一步一步来认知它,所以会采用一个博文系列的形式来记录我的认知过程。

SearchManager 的作用是提供对系统搜索服务的访问。要获取到对 Search Manager 的直接访问,只有通过 context.getSystemService(Context.SEARCH_SERVICE),而试图通过初始化 SearchManager,则是行不通的。

从搜索的角度来看,应用可分为三类: unsearchable 类型应用、Query-Search 类型应用和 Filter-Search 类型应用。大部分应用是属于后两种。不过,即便是第一种类型,应用也仍旧支持对搜索的调用。后两种的区分就在于,Query-Search 类型应用执行 batch-mode 搜索,每一个查询字符串都被转化成结果列表;Filter-Search 类型应用则提供 filter-as-you-type 搜索。通常来讲,对基于网络的数据进行 Query Search,而对本地数据,则需要 Filter Search。

除非万不得已,所有的应用都要支持调出搜索界面。换言之,当用户执行了搜索命令以后,搜索界面就要呈现给用户。目前,搜索命令通常是定义在菜单栏中名为“Search”的选项,在一些手机上会是一个特定的搜索键。

万一,应用属于第一种类型,你还是可以在 web search 模式下调出搜索界面。按下“搜索”以后,浏览器就会打开。这里需要注意,搜索界面是以浮动窗口(floating window)的形式出现,对 activity stack 是不会有任何改变的。

开发者应该考虑清楚采用什么样的方式来处理搜索请求,以下是四种建议:

  1. 自行捕获搜索命令,包括搜索按钮和菜单项,直接调用搜索界面。
  2. 提供 type-to-search,用户输入任何字符的同时自动启用搜索。
  3. 万一应用是 unsearchable,则允许通过搜索键(或者搜索菜单性)进行全局搜索。
  4. 彻底禁用搜索。

如果使用第一种建议,在定义菜单项的时候,Andriod 已经默认提供了一些资源,开发者可以使用 android.R.drawable.ic_search_category_default 作为菜单项的 icon,同时使用 SearchManager.MENU_KEY 作为快捷键。然后调用 onSearchRequested() 。

如果使用第二种建议,则需要在Activity里,调用setDefaultKeyMode,如下所示:

 

// search within your activity

setDefaultKeyMode(DEFAULT_KEYS_SEARCH_LOCAL);

// search using platform global search

setDefaultKeyMode(DEFAULT_KEYS_SEARCH_GLOBAL);

 

如果使用第三种建议,也就是使用 Quick Search Box 进行对设备和网络的搜索,有两种方式可供选择。其一,在 application 或 activity 中定义“search”,也就是在 mainifest 中增加一个meta-data;其二,通过默认实现 onSearchRequest() 触发全局搜索(也可以通过startSearth(String, boolean, Bundle, boolean))

如果使用第四种建议,则要覆写 onSearchRequest() 方法,如下所示:

 

@Override

public boolean onSearchRequested() {

     return false;

}

当搜索界面出现,原来的 activity 就会失去输入焦点,当搜索结束时,会有三种可能的结果:首先,用户取消了搜索界面,原来的 activity 重新获得输入焦点。可以通过 setOnDismissListener(SearchManager.OnDismissListener) 和 setOnCancelListener(SearchManager.OnCancelListener) 来获取清除搜索界面的事件通知。

其次,如果用户执行了搜索,这就需要切换到另外一个 activity 来接收和处理search Intent,原来的 activity 就可能进入 pause 或者 stop 状态。

最后,如果用户执行了搜索,并且当前的 activity 就是 search Intent 的接收者,则需要通过 onNewIntent 方法来接收消息。

 

源自: http://www.poemcode.net/2009/09/android-app-searchmanager-1/

【上篇】
【下篇】

抱歉!评论已关闭.