13.3 Android的应用内搜索

应用内搜索是Android为应用提供的搜索应用内信息的框架,用来帮助各个应用为用户提供统一的搜索服务。当应用中的界面组件需要为用户提供搜索服务时,就可以使用Android提供的应用内搜索框架来构建搜索功能。当用户单击设备上的搜索键时,Android会弹出样式统一的搜索框,在用户键入所需内容单击搜索键后,跳转到指定的搜索结果的界面组件中去。

很多Android系统应用中都使用了应用内搜索,比如:在联系人应用中通过应用内搜索功能快速找到所需的联系人;在浏览器应用中,利用应用内搜索可以进行网址的输入和关键字的搜索;在短信应用中,通过应用内搜索功能可以方便地找到需要的短信会话。通过对应用内搜索的支持,Android可以帮助开发人员更快速地为应用提供搜索服务,使得搜索的血液能够顺畅地流淌在Android的每个角落。

13.3.1 Android应用内搜索实现框架

整个Android应用内搜索框架,共由三部分构成,分别是:搜索对话框、搜索历史存储和搜索界面组件。

搜索对话框(Search Dialog)是提供搜索功能的交互界面,用户通过它来输入需要搜索的内容。在Android中,搜索对话框支持通过语音或文字来输入所要搜索的内容。当用户单击搜索键或者应用调用Activity.onSearchRequested函数时,就会弹出搜索对话框。搜索对话框的实现类是android.app.SearchDialog,它派生自对话框基类android.app.Dialog,因此,搜索对话框的展现并不会影响界面组件的生命周期。

在很多时候,用户倾向于搜索曾经搜索过的内容,为此,Android提供了搜索历史的存储支持。搜索历史可以在指定的数据库中进行存储,数据库中存储搜索历史的表共有两列,一列存储搜索内容,一列存储搜索时间。

搜索结果组件用于呈现搜索结果的界面组件。与普通界面组件稍有不同,作为搜索结果载体的界面组件需要具有以下几个特征:

1)能够接受Action为Intent.ACTION_SEARCH的意图请求,并可以处理与之相关的Extra数据[1]

2)组件的任务模型通常配置成singleTop,也就是说在一个应用任务中,只需要一个搜索结果界面组件的实例;

3)当界面组件的运行模型为singleTop,就需要重载Activity.onNewIntent函数来处理新的请求。

整个应用内搜索流程如图13-4所示。当用户触发搜索时,搜索对话框会弹出,在输入搜索内容执行搜索后,搜索对话框所在的界面组件就会发出一个意图请求,其action为Intent.ACTION_SEARCH,其中还包含搜索关键字SearchManager.QUERY等附加数据(作为extras来传递)。组件管理服务收到请求时,会根据配置文件中的内容,定位到能够响应该意图的搜索结果组件,构造或者唤醒该组件对象,并将Intent对象传递给它。

13.3 Android的应用内搜索 - 图1

图 13-4 应用内搜索的模块构成及其基本的交互流程

[1]参见:http://developer.android.com/reference/android/content/Intent.html#ACTION_SEARCH。