分享

Android中全局搜索(QuickSearchBox)详解

 汲水阁 2015-05-29

原文链接:

http://blog.csdn.net/mayingcai1987/archive/2011/03/21/6265797.aspx  (一)

http://blog.csdn.net/mayingcai1987/archive/2011/03/22/6268732.aspx  (二)

http://blog.csdn.net/mayingcai1987/archive/2011/03/23/6270881.aspx (三)

 

Android中全局搜索(QuickSearchBox)详解(一)

1. 全局搜索(QuickSearchBox)介绍:
全局搜索(QuickSearchBox)是Android系统中原生的应用程序,它的主要职能是接收用户的搜索请求,并将搜索请求传达给支持全局搜索的 应用程序,应用程序执行搜索操作,并将搜索到的結果返回给全局搜索应用程序,全局搜索应用根据搜索結果渲染UI界面,当用户单击某一个搜索出来的結果项就 会打开相应的应用程序,显示搜索結果的詳細信息。

2. 全局搜索(QuickSearchBox)技术架构:

Android系统的全局搜索由搜索管理器(SearchManager),全局搜索AppWidget,全局搜索应用,支持全局搜索的应用程序(联系人,音乐,浏览器等)四大部分组成:

(1)framework层的搜索管理器(SearchManager):主要功能是对Android系统全局搜索提供支持,当Android系统 启动完成后会发出系统启动完成(BOOT_COMPLETED)广播,SearchManager接收到此广播后会通过PackageManager搜索 系统中支持全局搜索的应用程序(应用程序如何支持全局搜索以后的文章会介绍),这此支持全局搜索的应用我们称为搜索源,SearchManager解析搜 索源的配置信息并将这些配置信息封装成对象保存在List列表中供全局搜索应用程序使用。

(2)全局搜索AppWidget:AppWidget是搜索的入口,当用户需要使用全局搜索时会单击已经添加到桌面的全局搜索AppWidget,这时会打开全局搜索应用。

(3)全局搜索应用程序(QuickSearchBox):它的主要职能是接受用户的输入请求,启动异步搜索,将搜索到的結果显示。

(4)支持全局搜索的应用程序:每一个支持全局搜索的应用程序都需要实现一个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界面中。

 

Android中全局搜索(QuickSearchBox)详解(二)


1. 标题:

应用程序如何全面支持搜索

2. 引言:

如果想让某个应用程序支持全局搜索,必须对这个应用程序进行一系列配置,并实现可被外界访问的内容提供者向搜索应用程序 (QuickSearchBox)提供搜索結果,根据配置信息,应用程序可被搜索框架识别为搜索源,搜索应用程序(QuickSearchBox)也可以 通过解析配置信息组拼成URI请求应用的ContentProvider获取搜索結果。

3. 配置实现:

1. 应用程序中应当存在一个Activity,这个Activity在AndroidManifest.xml中的基本配置,如下:

<activity android:name=”com.focus.FishMeActivity” android:label=”@string/app_name”>
<intent-filter>
<action android:name=”android.intent.action.MAIN” />
<category android:name= “android.intent.category.LAUNCHER” />
</intent-filter>

<!– 全局搜索支持  开始 –>
<!– 这个intent-filter是搜索框架启动这个Activity时Intent中配置的action见下面Activity作用第二项 –>
<intent-filter>
<action android:name= “com.focus.FISH_ME”/>
<category android:name=”android.intent.category.DEFAULT” />
</intent-filter>

<!– 这个intent-filter是固定配置不需要改变,拷过去直接用–>
<intent-filter>
<action android:name=”android.intent.action.SEARCH” />
<category android:name= “android.intent.category.DEFAULT” />
</intent-filter>

<!– 这个meta-data也是固定配置不需要改动,他需要一个xml文件,下面会有这个xml文件的最标准,最简单的配置,请继续向下看

(searchable.xml)–>
<meta-data android:name=”android.app.searchable” android:resource=”@xml/searchable” />
<!– 全局搜索支持  结束 –>

</activity>

说一下这个Activity的作用:

第一,这样一个Activity在你的应用程序中是必须存在的,因为你配置了上面我用红色注释标注的代码后,这个Activity可以被识别为搜索源,

你的应用支持全局搜索了。

第二,当搜索出結果信息后单击某一个結果项后会打开这个Activity显示搜索出的内容。

2. searchable.xml最基本,最简单配置:

<?xml version=”1.0″ encoding=”utf-8″?>
<searchable xmlns:android=”http://schemas./apk/res/android”
<!– 这两个属性是固定的必须有–>
android:label=”@string/search_label”
android:includeInGlobalSearch=”true”
<!– 这个authority是你写的ContentProvider的Authority,下面会说到 –>
android:searchSuggestAuthority=”com.focus.FISH_ME_AUTHORITY”
<!–这个action就是上面1中你配置的action–>
android:searchSuggestIntentAction=”com.focus.FISH_ME”>
</searchable>

这个文件的属性介绍会在后面的文章讲到。

3. 在AndroidManifest.xml文件中配置ContentProvider:

<provider

android:name = “FishMeProvider”
<!–这个authority和上面2中配置的authority相对应–>
android:authorities= “com.focus.FISH_ME_AUTHORITY”

/>

4. 如何构建Content Provider:

在QuickSearchBox中通过ContentResolver调用内容提供者的query(Uri, String[], String, String[], String)方法进行信息搜索,应用程序必须实

现这个方法并且返回搜索到的Cursor对象。

下面将对ContentProvider的query方法的参数进行说明:

第一个参数(uri):

content://authority/suggestion.path/search_suggest_query/queryStr?limit=50

authority:对应searchable.xml文件中的android:searchSuggestAuthority属性。
suggestion.path:对应searchable.xml文件中的android:searchSuggestPath属性。
search_suggest_query : 固定字符串。
queryStr: 查询字符串。
limit : 查询条数。

第二个参数(projection):一直为null。

第三个参数(selection):对应searchable.xml文件中android:searchSuggestSelection属性,ContentProvider的query方法将会调用SQLite数据

库的Query方法,用这个参数组成SQL语句中where后面的条件,如:where name like ?,”name like ? ”就是selection参数的值,注意,

android:searchSuggestSelection属性中配置的查询条件不能用“AND”或“OR”等符号连接多个条件(不能写成:“name like ? AND age like ?”)。

第四个参数(selectionArgs):如果searchable.xml文件中android:searchSuggestSelection属性值不为空,程序会将查询字符串做为这个数组

的第一个元素,也是唯一的元素,在上面第三个参数中定义了查询条件,这个参数的作用是给查询条件中的问号赋值。

第五个参数:一直为null。

该方法将搜索到的数据以cursor对象的形式返回。

 

Android中全局搜索(QuickSearchBox)详解(三)


1. 标题:

支持全局搜索的应用程序的配置文件介绍

2. 引言:

在全局搜索应用程序(QuickSearchBox)进行搜索或打开相关应用程序显示搜索結果时,从搜索源(支持全局搜索的应用程序)中获取配置信 息,根据配置信息可以组拼成URI 请求搜索源的ContentProvider 或构建Intent 打开搜索应用显示搜索結果, 等.

3. 配置介绍:

在应用程序的res目录中新建xml目录,在xml目录中新建searchable.xml文件,默认配置为:

<?xml version = “1.0″ encoding = “utf-8″?>
<searchable
xmlns:android = “http://schemas./apk/res/android”
android:label = “@string/app_label”
>
</searchable>

属性:

(1)android:label (String字符串,必须存在,一般为应用程序中Activity或Application的名称,在配置中包含

android:includeInGlobalSearch属性时起作用,在设置搜索范围时显示应用名称)。

(2)android:hint (String字符串,搜索输入框中的提示信息,格式为:”Search ***”)。

(3)android:searchMode (关键词,当搜索結果列表中的某一项获得焦点时,使用这一项的某些值进行重新搜索,信息包括二种,第一,

“queryRewriteFromData”,使用搜索結果Cursor中的”SUGGEST_COLUMN_INTENT_DATA”列值,第二,”queryRewriteFromText”,

使用搜索結果Cursor中的”SUGGEST_COLUMN_TEXT_1″列值)。

(4) android:searchButtonText (String字符串,搜索按钮提示内容,默认是图片)。

(5)android:inputType (关键词,搜索框输入法类型)。

(6)android:imeOptions (关键词,搜索框输入法的设置选项)。

(7)android:searchSuggestAuthority (String字符串,提供搜索功能的ContentProvider的Authority)。

(8)android:searchSuggestPath (String字符串,请求搜索ContentProvider的URI的建议路径)。

(9)android:searchSuggestSelection (String字符串,Where条件,例:”uri like ?”)。

(10)android:searchSuggestIntentAction (String字符串,单击搜索結果列表中的某一项时,发出Intent对象中的Action)。

(11)android:searchSuggestIntentData (String字符串,单击搜索結果列表中的某一项时,发出Intent对象中的Data)。

(12)android:searchSuggestThreshold (int值,输入多少个字符后开始搜索)。

(13)android:includeInGlobalSearch (boolean值,是否支持全局搜索QuickSearchBox))。

(14)android:searchSettingsDescription (String字符串,搜索设置的描述信息)。

(15)android:queryAfterZeroResults (boolean值,”true”,”false”如果搜索結果为零,下次搜索时则不会使用搜索源搜索,重启

SearchDialog后又可搜索)。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多