Androidsearch小部件 – onQueryTextSubmit和发送Intent到SearchableActivity的区别?

我有一个包含SearchView小部件的活动。 我正在处理使用onQueryTextSubmit监听器的文本search的结果,这工作正常。 (活动本身被指定为可search活动)。

我最近决定添加语音识别,在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> 

当我添加语音识别时,onQueryTextSubmit监听器在提供语音input后不会被调用(但是,在使用editText框提供文本input后,它仍然被调用)。 语音识别器发送一个ACTION_SEARCH返回到相同的Activity(可以在onCreate方法中处理)。 有没有一种方法来激活与语音识别器(或类似的东西不需要重新创build活动?)的onQueryTextSubmit方法?我问的原因是因为如果识别器必须发送一个意图,我必须创build发送附加包与APP_DATA,似乎并没有工作。

所以我的问题是:

(1)您如何使用(或者可以使用)onQueryTextSubmit侦听器并启用语音识别search? (你可以用普通的基于文本的search来使用它)

(2)如果(1)不可能,那么如何通过意图传递附加数据和语音识别search查询? 我试图通过onSearchRequested()像这样添加它:

 @Override public boolean onSearchRequested() { Bundle appData = new Bundle(); appData.putInt("testKey", 44); this.startSearch(null, true, appData, false); return true; } 

但是当我尝试在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处理程序时,按下放大镜图标会使search窗口小部件两次展开,我想这是因为除了设置了可search的xml外,我还是手动开始search组态)。

在相关说明中,发送意图在同一活动中使用侦听器的优点是什么? 我明白,如果您的SearchableActivity是另一个活动,那么你会想发送一个意图, 但是在SearchableActivity与包含search小部件的活动相同的情况下,使用intent的意义何在?

任何意见和build议将不胜感激。 让我知道如果我需要提供任何额外的细节。

(1)据我所知,通过广泛的debuggingonQueryTextSubmit永远不会被调用,当我通过我的语音识别器buttoninputsearch查询。 但是,有一个简单的解决方法 – 见下文。

(2)通过将活动启动模式设置为“singleTop”,我解决了我的问题 – 这意味着在语音search之后不再重新创build活动,新的ACTION_SEARCH意图在onNewIntent()中的活动的现有实例中处理处理程序。 因此,您可以访问现有活动的所有私有成员,并且您不需要通过修改search意图来传递任何数据。

AndroidManifest.xml :将launchmode = singleTop属性添加到您的可search活动:

 <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> 

SearchableActivity中 ,添加onNewIntent()方法:

 @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); } } 

这基本上接收语音识别器查询,并将其放在文本框中,并像平常一样提交由onQueryTextSubmit处理的文本框search。