一、本地搜索介绍
1. 全局搜索(QuickSearchBox)介绍:
搜索是Android上的核心用户功能。用户应该能够搜索他们可用的任何数据,无论内容是位于设备还是Internet上。为了帮助用户创建一致的搜索体验,Android提供了一个搜索框架,可帮助您实现对您的应用程序的搜索,当用户单击某一个搜索出来的结果项就会打开相应的应用程序,显示搜索結果的详细信息。
2. 全局搜索(QuickSearchBox)技术架构:
Android系统的全局搜索由搜索管理器(SearchManager),全局搜索AppWidget,全局搜索应用,支持全局搜索的应用程序(联系人,音乐,浏览器等)四大部分组成:
(1)framework层的搜索管理器(SearchManager):主要功能是对Android系统全局搜索提供支持,当Android系统启动完成后会发出系统启动完成(BOOT_COMPLETED)广播,SearchManager接收到此广播后会通过PackageManager搜索系统中支持全局搜索的应用程序(应用程序如何支持全局搜索以后的文章会介绍),这此支持全局搜索的应用我们称为搜索源,SearchManager解析搜索源的配置信息并将这些配置信息封装成对象保存在List列表中供全局搜索应用程序使用。
(2)搜索框架提供两种搜索输入模式:屏幕顶部的搜索对话框或可以嵌入到活动布局中的搜索小部件(SearchView)。无论哪种情况,Android系统将通过向执行搜索的特定活动提供搜索查询来协助您的搜索实现。您还可以启用搜索对话框或窗口小部件来提供用户类型的搜索建议。
(3)支持全局搜索的应用程序:每一个支持全局搜索的应用程序都需要实现一个ContentProvider,通过这个ContentProvider向外提供数据,全局搜索应用(QuickSearchBox)会调用这些ContentProvider获取数据。
3. 搜索执行全过程:
Android系统启动完成,发出系统启动完成(BOOT_COMPLETED)广播,搜索管理器(SearchManager + Service)接收到此广播后会通过PackageManager搜索系统中支持全局搜索的应用程序,并解析这些应用程序的配置信息(配置信息中包括请求支持全局搜索应用的ContentProvider的authority及其它配置信息,这些配置信息由应用的开发人员配置),封装成对象保存到List中,当用户单击Launcher中的全局搜索的AppWidget组件后打开全局搜索应用(QuickSearchBox)的主界面,在界面中的搜索输入框中输入搜索内容,这时全局搜索应用(QuickSearchBox)会从搜索管理器(SearchManager + Service)中取出全部支持全局搜索的应用程序List,并解析它们的配置信息,根据配置信息(authority等)组将成URI,要据URI调用支持全局搜索应用的ContentProvider,ContentProvider的查询方法会根据URI搜索数据,并将搜索到的結果以Cursor型式返回,全局搜索应用会解决这些数据,并以List的形式显示到UI界面中。
二、APP配置全局搜索信息 :GoogleAPI:https://developer.android.com/guide/topics/search/searchable-config.html
1)应用程序支持全局搜索,向搜索程序提供搜索结果,成为搜索源,搜索应用程序可以通过解析配置信息组拼成URI请求应用的ContentProvider获取搜索結果
定义Android系统使用的所有搜索配置,以提供辅助搜索如下:
配置activity
<application ... > <activity android:name=".SearchableActivity" >
<!-- Receives the search request. --> <intent-filter> <action android:name="android.intent.action.SEARCH" /> <!-- No category needed, because the Intent will specify this class component--> </intent-filter> <!-- Points to searchable meta data. --> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> ...
<!-- Points to searchable activity so the whole app can invoke search. --> <meta-data android:name="android.app.default_searchable" android:value=".SearchableDictionary" /> </application>
在应用程序的res目录中新建xml目录,在xml目录中新建searchable.xml文件:
<searchable xmlns:android="http://schemas.android.com/apk/res/android" android:label="@string/search_label" android:hint="@string/search_hint" android:searchSettingsDescription="@string/settings_description" android:searchSuggestAuthority="com.example.android.searchabledict.DictionaryProvider" //和提供搜索功能的Contentprovider:autherity一致 android:searchSuggestIntentAction="android.intent.action.VIEW" // String字符串,单击搜索結果列表中的某一项时,发出Intent对象中的Action /也可以在数据库中加入SUGGEST_COLUMN_INTENT_ACTION字段绑定action。 android:searchSuggestIntentData="content://com.example.android.searchabledict.DictionaryProvider/dictionary" // 配置的URI信息 android:searchSuggestSe