Android搜索小部件-onQueryTextSubmit和向SearchableActivity发送意图之间的区别?

Android搜索小部件-onQueryTextSubmit和向SearchableActivity发送意图之间的区别?,android,search,android-intent,voice-recognition,Android,Search,Android Intent,Voice Recognition,我有一个包含SearchView小部件的活动。我使用onQueryTextSubmit监听器处理文本搜索的结果,效果很好。(活动本身被指定为可搜索活动) 我最近决定添加语音识别,在searchable.xml文件中添加“voiceSearchMode”属性: searchable.xml <?xml version="1.0" encoding="utf-8"?> <searchable xmlns:android="http://schemas.android.com/apk

我有一个包含SearchView小部件的活动。我使用onQueryTextSubmit监听器处理文本搜索的结果,效果很好。(活动本身被指定为可搜索活动)

我最近决定添加语音识别,在searchable.xml文件中添加“voiceSearchMode”属性:

searchable.xml

<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search_hint"
    android:voiceSearchMode="showVoiceSearchButton|launchRecognizer">
</searchable>
但当我尝试在onCreate中访问此文件时,appData为空:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.overview_list);

    Bundle extras = getIntent().getExtras();
    Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);

    // Receive search intents (from voice recognizer)
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      //doMySearch(query);
    }
}
(另外,当我添加onSearchRequested处理程序时,按下放大镜图标会将搜索小部件相互展开两次——我想这是因为除了设置可搜索的xml配置之外,我还手动启动搜索)

与此相关的一点是,发送意图比在同一活动中使用侦听器有什么好处?我理解,如果您的SearchableActivity是另一项活动,那么您会希望向其发送意向;但是,如果SearchableActivity是包含搜索小部件的同一个活动,那么使用意图有什么意义呢

如有任何意见和建议,将不胜感激。如果我需要提供任何其他详细信息,请告诉我。

(1)据我所知,通过QueryTextSubmit上的大量调试,当我通过语音识别器按钮输入搜索查询时,从未调用过。然而,有一个简单的解决方法-见下文

(2) 我通过将activity launch mode设置为“singleTop”解决了我的问题—这意味着在语音搜索后不重新创建activity,而是在onNewIntent()处理程序中的现有activity实例中处理新的ACTION_搜索意图。因此,您可以访问现有活动的所有私有成员,并且不需要通过修改搜索意图通过捆绑包传递任何数据

AndroidManifest.xml:将launchmode=singleTop属性添加到可搜索的活动中:

<activity
    android:name=".SearchableActivity"
    android:label="@string/app_name"
    android:uiOptions="splitActionBarWhenNarrow"
    android:launchMode="singleTop">

    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>

这实际上接收语音识别器查询并将其放入文本框中,然后提交文本框搜索,该搜索由onQueryTextSubmit一如既往地处理。

谢谢!解决了我的头痛:)你能给我演示一下吗?
<activity
    android:name=".SearchableActivity"
    android:label="@string/app_name"
    android:uiOptions="splitActionBarWhenNarrow"
    android:launchMode="singleTop">

    <intent-filter>
        <action android:name="android.intent.action.SEARCH" />
    </intent-filter>
    <meta-data android:name="android.app.searchable"
        android:resource="@xml/searchable" />
</activity>
@Override
public void onNewIntent(Intent intent) {
    super.onNewIntent(intent);      
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
        // Gets the search query from the voice recognizer intent
        String query = intent.getStringExtra(SearchManager.QUERY);

        // Set the search box text to the received query and submit the search
        mSearchView.setQuery(query, true);
    }
}