Android Search框架

Android系统中大部分搜索功能的实现使用的是Android系统提供的SearchView控件,因此搜索是采用Android系统的Search Framework来实现的。下面对Search Framework简要分析:

用户提交查询后,Android系统构造一个Intent并把用户的查询内容放在这个Intent中。然后Android启动自定义的用来处理用户查询的Activity(SearchActivity),并把这个Intent发给该Activity。为了能够使用Android系统提供的Search Framework.需要以下几步:

1. Creating a Searchable Configuration

首先定义一个Searchable configuration,用于描述SearchView的一些属性,该描述文件按惯例通常命名为searchable.xml 并定义在/res/xml 目录下。

<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:value="com.android.calendar.SearchActivity"
    android:label="@string/app_label"
    android:searchMode="showSearchLabelAsBadge"

    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"
    android:voiceLanguageModel="free_form"


android:searchSuggestAuthority="com.android.calendar.CalendarRecentSuggestionsProvider"
    android:searchSuggestSelection=" ? "
    android:imeOptions="actionSearch" >
</searchable>

只有android:label是必须的,一般定义为应用程序的名称。

2. Creating a Searchable Activity

一个”Searchable Activity”就是一个可以用来处理Search Query 的Activity。和一般的Activity没有太大分别。当用户提交查询后,Android会给这个“Searchable Activity”发送一个Intent包含有用户查询内容,同时这个Intent 含有ACTION_SEARCH action。

由于可以在任何一个Activity中使用SearchView,Android需要知道哪个Activity
是“Searchable Activity”,这就需要在AndroidManifest.xml中来定
义“SearchActivity”。
本例中定义为“SearchActivity”,它在AndroidManifest.xml中定义为:

<activity android:name="SearchActivity"
            android:label="@string/search_title"
            android:launchMode="singleTop"
            android:theme="@style/CalendarTheme.WithActionBar"
            android:windowSoftInputMode="stateAlwaysHidden"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.SEARCH"/>
            </intent-filter>
            <meta-data android:name="android.app.searchable"
                 android:resource="@xml/searchable"/>
</activity>

SearchActivity 需要在Intent-filter中指定android.intent.action.SEARCH,并在<meta-data>部分指定 searchable configuration (指向res/xml/searchable.xml)SearchActivity用来处理查询请求Intent的代码如下
...........
        Intent intent = getIntent();
        if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
            String query;
            if (icicle != null &&
icicle.containsKey(BUNDLE_KEY_RESTORE_SEARCH_QUERY)) {
                query =
icicle.getString(BUNDLE_KEY_RESTORE_SEARCH_QUERY);
            } else {
                query = intent.getStringExtra(SearchManager.QUERY);
            }
            initFragments(millis, query);
        }
...........
    private void initFragments(long timeMillis, String query) {
        FragmentManager fragmentManager = getFragmentManager();
        FragmentTransaction ft = fragmentManager.beginTransaction();
        AgendaFragment searchResultsFragment = new AgendaFragment(timeMillis, true);
        ft.replace(R.id.search_results, searchResultsFragment);
        mController.registerEventHandler(R.id.search_results, searchResultsFragment);
        ft.commit();
        Time t = new Time();
        t.set(timeMillis);
        search(query, t);
    }
...........

上述大概就是Android系统中Search Framework处理流程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值