大家都知道android平台最初是由google推出的,然后google又主导成立了OHA继续推动android的发展。现在搜索应用可能是使用率最高的一个,google最核心的产品就是搜索,因此android必定要搭载这个功能。本文就介绍一下android上的本地搜索框架。
要说本地搜索,首先就要介绍ContentProvider和ContentResolver这两个android上的重要组件。
ContentProvider
直译就是“内容提供者”,我觉得这个很形象,他就是一个类似于数据源的东西,帮助App或者说帮助整个平台管理数据。因为android上app间的数据是相互独立的,一个app不可以直接访问另一个app的数据,有了ContentProvider这个机制,不同app间就可以互相访问数据,而且还不破坏原有的独立性。
ContentResolver
App通过ContentProvider将自己的数据公开,其他App要访问这份数据就要通过ContentResolver来获取对应的ContentProvider的远程访问方法,然后操作数据。ContentProvider和ContentResolver之间是通过Binder机制连接的,各模块间关系如下图:
ContentProvider和ContentResolver都提供了一个query()方法,看到这个方法名字大家应该都清楚了,搜索功能就是通过这个方法实现的。另外,Android上有一个SearchManager模块,是专门用于处理搜索请求的,每个App启动搜索功能时都要通过它。
Android上的搜索功能分三类:
1.网络搜索
2.App内部资源搜索
3.本地全局搜索
其中网络搜索功能没接触过,本文不涉及。
App内部资源搜索
这个功能主要就是应用了ContentProvider和ContentResolver这对组件,如下图:
一个App具有搜索功能,那么它必须有两类Activity:
SearchableActivity 可以启动搜索功能的Activity
QueryActivity 用于完成搜索和显示搜索结果的Activity
SearchableActivity启动搜索功能时,会调用SearchManager,然后SearchDialog会被创建,就是我们看到的搜索框。在框中输入搜索关键字压下搜索键后,SearchDialog会启动QueryActivity,ContentResolver的query()方法被调用,最后将搜索结果显示出来,搜索结束。
本地全局搜索(GlobalSearch)
这个功能的实现主要也是通过ContentProvider和ContentResolver,如下图:
通过桌面上的搜索框widget启动本地全局搜索,同样会创建SearchDialog,SearchDialog将搜索请求发送到GlobalSearch模块,GlobalSearch通过ContentResolver分别访问各个可检索App的ContentProvider,最后经过一些异步处理将结果显示在屏幕上。
Android的本地检索功能完全是基于ContentProvider的,也就是说如果一个App没有创建ContentProvider,这个App的数据就无法被搜索。而且搜索效率完全取决于各个ContentProvider的query()方法的执行效率,我见过的大多数ContentProvider都是通过数据库实现的,因此搜索的效率主要取决于Android的数据库sqlite。
本文仅仅描述了搜索功能的大体实现思路,源码还是比较复杂的,这里提到的只是九牛一毛。