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.android.com/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对象的形式返回。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值