page.title=Creating a Search Interface
page.tags=searchview
@jd:body

<div id="qv-wrapper">
<div id="qv">


<h2>In this document</h2>
<ol>
  <li><a href="#TheBasics">The Basics</a></li>
  <li><a href="#SearchableConfiguration">Creating a Searchable Configuration</a></li>
  <li><a href="#SearchableActivity">Creating a Searchable Activity</a>
    <ol>
      <li><a href="#DeclaringSearchableActivity">Declaring a searchable activity</a></li>
      <li><a href="#PerformingSearch">Performing a search</a></li>
    </ol>
  </li>
  <li><a href="#SearchDialog">Using the Search Dialog</a>
    <ol>
      <li><a href="#InvokingTheSearchDialog">Invoking the search dialog</a></li>
      <li><a href="#LifeCycle">The impact of the search dialog on your activity lifecycle</a></li>
      <li><a href="#SearchContextData">Passing search context data</a></li>
    </ol>
  </li>
  <li><a href="#UsingSearchWidget">Using the Search Widget</a>
    <ol>
      <li><a href="#ConfiguringWidget">Configuring the search widget</a></li>
      <li><a href="#WidgetFeatures">Other search widget features</a></li>
      <li><a href="#UsingBoth">Using both the widget and the dialog</a></li>
    </ol>
  </li>
  <li><a href="#VoiceSearch">Adding Voice Search</a></li>
  <li><a href="#SearchSuggestions">Adding Search Suggestions</a></li>
</ol>

<h2>Key classes</h2>
<ol>
<li>{@link android.app.SearchManager}</li>
<li>{@link android.widget.SearchView}</li>
</ol>

<h2>Related samples</h2>
<ol>
<li><a href="{@docRoot}resources/samples/SearchableDictionary/index.html">Searchable
Dictionary</a></li>
<li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/SearchViewActionBar.html">SearchView
    in the Action Bar</a></li>
<li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/view/SearchViewFilterMode.html">SearchView
    filter mode</a></li>
</ol>

<h2>Downloads</h2>
<ol>
<li><a href="{@docRoot}design/downloads/index.html#action-bar-icon-pack">Action Bar
Icon Pack</a></li>
</ol>

</div>
</div>

<p>When you're ready to add search functionality to your application, Android helps you implement
the user interface with either a search dialog that appears at the top of the activity window or a
search widget that you can insert in your layout. Both the search dialog and the widget can deliver
the user's search query to a specific activity in your application. This way, the user can initiate
a search from any activity where the search dialog or widget is available, and the system starts the
appropriate activity to perform the search and present results.</p>

<p>Other features available for the search dialog and widget include:</p>

<ul>
  <li>Voice search</li>
  <li>Search suggestions based on recent queries</li>
  <li>Search suggestions that match actual results in your application data</li>
</ul>

<p>This guide shows you how to set up your application to provide a search interface
that's assisted by the Android system to deliver search queries, using either the
search dialog or the search widget.</p>


<h2 id="TheBasics">The Basics</h2>

<div class="figure" style="width:250px">
<img src="{@docRoot}images/search/search-ui.png" alt="" height="417" />
<p class="img-caption"><strong>Figure 1.</strong> Screenshot of an application's search dialog.</p>
</div>

<p>Before you begin, you should decide whether you'll implement your search interface using the
search dialog or the search widget. Both provide the same search features, but in slightly different
ways:</p>

<ul>
  <li>The <strong>search dialog</strong> is a UI component that's controlled by the Android system.
When activated by the user, the search dialog appears at the top of the activity, as shown in figure
1.
    <p>The Android system controls all events in the search dialog. When the user
submits a query, the system delivers the query to the activity that you specify to
handle searches. The dialog can also provide search suggestions while the user types.</p></li>

  <li>The <strong>search widget</strong> is an instance of {@link android.widget.SearchView} that
you can place anywhere in your layout. By default, the search widget behaves like a standard {@link
android.widget.EditText} widget and doesn't do anything, but you can configure it so that the
Android system handles all input events, delivers queries to the appropriate activity, and provides
search suggestions (just like the search dialog). However, the search widget is available only in
Android 3.0 (API Level 11) and higher.

<p class="note"><strong>Note:</strong> If you want, you can handle all user input into the
search widget yourself, using various callback methods and listeners. This document, however,
focuses on how to integrate the search widget with the system for an assisted search
implementation. If you want to handle all user input yourself, read the reference documentation for
{@link android.widget.SearchView} and its nested interfaces. </p></li>
</ul>

<p>When the user executes a search from the search dialog or a search widget, the system creates an
{@link android.content.Intent} and stores the user query in it. The system then starts the activity
that you've declared to handle searches (the "searchable activity") and delivers it the intent. To
set up your application for this kind of assisted search, you need the following:</p>

<ul>
  <li>A searchable configuration
  <p>An XML file that configures some settings for the search dialog or widget. It includes settings
for features such as voice search, search suggestion, and hint text for the search box.</p></li>
  <li>A searchable activity
  <p>The {@link android.app.Activity} that receives the search query, searches your
data, and displays the search results.</p></li>
  <li>A search interface, provided by either:
    <ul>
      <li>The search dialog
        <p>By default, the search dialog is hidden, but appears at the top of the screen when
          you call {@link android.app.Activity#onSearchRequested()} (when the user presses your
          Search button).</p>
      </li>
      <li>Or, a {@link android.widget.SearchView} widget
        <p>Using the search widget allows you to put the search box anywhere in your activity.
Instead of putting it in your activity layout, you should usually use
{@link android.widget.SearchView} as an 
<a href="{@docRoot}guide/topics/ui/actionbar.html#ActionView">action view in the Action Bar</a>.</p>
      </li>
    </ul>
  </li>
</ul>

<p>The rest of this document shows you how to create the searchable configuration, searchable
activity, and implement a search interface with either the search dialog or search widget.</p>


<h2 id="SearchableConfiguration">Creating a Searchable Configuration</h2>

<p>The first thing you need is an XML file called the searchable configuration. It configures
certain UI aspects of the search dialog or widget and defines how features such as suggestions and
voice search behave. This file is traditionally named {@code searchable.xml} and must be saved in
the {@code res/xml/} project directory.</p>

<p class="note"><strong>Note:</strong> The system uses this file to instantiate a {@link
android.app.SearchableInfo} object, but you cannot create this object yourself at
runtime&mdash;you must declare the searchable configuration in XML.</p>

<p>The searchable configuration file must include the <a
href="{@docRoot}guide/topics/search/searchable-config.html#searchable-element">{@code
&lt;searchable&gt;}</a> element as the root node and specify one
or more attributes. For example:</p>

<pre>
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_label"
    android:hint="@string/search_hint" >
&lt;/searchable>
</pre>

<p>The {@code android:label} attribute is the only required attribute. It points to a string
resource, which should be the application name. This label isn't actually visible to the
user until you enable search suggestions for Quick Search Box. At that point, this label is visible
in the list of Searchable items in the system Settings.</p>

<p>Though it's not required, we recommend that you always include the {@code android:hint}
attribute, which provides a hint string in the search box before users
enters a query. The hint is important because it provides important clues to users about what
they can search.</p>

<p class="note"><strong>Tip:</strong> For consistency among other
Android applications, you should format the string for {@code android:hint} as "Search
&lt;content-or-product&gt;". For example, "Search songs and artists" or "Search
YouTube".</p>

<p>The <a
href="{@docRoot}guide/topics/search/searchable-config.html#searchable-element">{@code
&lt;searchable&gt;}</a> element accepts several other attributes. However, you don't need
most attributes until you add features such as <a href="#SearchSuggestions">search suggestions</a>
and <a href="#VoiceSearch">voice search</a>. For detailed information about the searchable
configuration file, see the <a
href="{@docRoot}guide/topics/search/searchable-config.html">Searchable Configuration</a> reference
document.</p>



<h2 id="SearchableActivity">Creating a Searchable Activity</h2>

<p>A searchable activity is the {@link android.app.Activity} in your application that performs
searches based on a query string and presents the search results.</p>

<p>When the user executes a search in the search dialog or widget, the system starts your
searchable activity and delivers it the search query in an {@link
android.content.Intent} with the  {@link android.content.Intent#ACTION_SEARCH} action. Your
searchable activity retrieves the query from the intent's {@link android.app.SearchManager#QUERY
QUERY} extra, then searches your data and presents the results.</p>

<p>Because you may include the search dialog or widget in any other activity in your application,
the system must know which activity is your searchable activity, so it can properly deliver the
search query. So, you must first declare your searchable activity in the Android manifest file.</p>


<h3 id="DeclaringSearchableActivity">Declaring a searchable activity</h3>

<p>If you don't have one already, create an {@link android.app.Activity} that will perform
searches and present results. You don't need to implement the search functionality yet&mdash;just
create an activity that you can declare in the manifest. Inside the manifest's <a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
element:</p>
<ol>
  <li>Declare the activity to accept the {@link android.content.Intent#ACTION_SEARCH} intent, in an
<a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
&lt;intent-filter&gt;}</a>
element.</li>
  <li>Specify the searchable configuration to use, in a <a
href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data&gt;}</a>
element.</li>
</ol>

<p>For example:</p>

<pre>
&lt;application ... >
    &lt;activity android:name=".SearchableActivity" >
        &lt;intent-filter>
            &lt;action android:name="android.intent.action.SEARCH" />
        &lt;/intent-filter>
        &lt;meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    &lt;/activity>
    ...
&lt;/application>
</pre>

<p>The {@code &lt;meta-data&gt;} element must include the {@code android:name} attribute with a
value of {@code "android.app.searchable"} and the {@code android:resource} attribute with a
reference to the searchable configuration file (in this example, it
refers to the {@code res/xml/searchable.xml} file).</p>

<p class="note"><strong>Note:</strong> The <a
href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
&lt;intent-filter&gt;}</a> does not need a <a
href="{@docRoot}guide/topics/manifest/category-element.html">{@code &lt;category&gt;}</a> with the
{@code DEFAULT} value (which you usually see in <a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> elements),
because the system delivers the {@link android.content.Intent#ACTION_SEARCH} intent explicitly to
your searchable activity, using its component name.</p>



<h3 id="PerformingSearch">Performing a search</h3>

<p>Once you have declared your searchable activity in the manifest, performing a search in your
searchable activity involves three steps:</p>

<ol>
  <li><a href="#ReceivingTheQuery">Receiving the query</a></li>
  <li><a href="#SearchingYourData">Searching your data</a></li>
  <li><a href="#PresentingTheResults">Presenting the results</a></li>
</ol>

<p>Traditionally, your search results should be presented in a {@link android.widget.ListView}, so
you might want your searchable activity to extend {@link android.app.ListActivity}. It includes
a default layout with a single {@link android.widget.ListView} and provides several
convenience methods for working with the {@link android.widget.ListView}.</p>


<h4 id="ReceivingTheQuery">Receiving the query</h4>

<p>When a user executes a search from the search dialog or widget, the system starts your
searchable activity and sends it a {@link android.content.Intent#ACTION_SEARCH} intent. This intent
carries the search query in the
{@link android.app.SearchManager#QUERY QUERY} string extra. You must check for
this intent when the activity starts and extract the string. For example, here's how you can get the
search query when your searchable activity starts:</p>

<pre>
&#64;Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);

    // Get the intent, verify the action and get the query
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}
</pre>

<p>The {@link android.app.SearchManager#QUERY QUERY} string is always included with
the {@link android.content.Intent#ACTION_SEARCH} intent. In this example, the query is
retrieved and passed to a local {@code doMySearch()} method where the actual search operation
is done.</p>


<h4 id="SearchingYourData">Searching your data</h4>

<p>The process of storing and searching your data is unique to your application.
You can store and search your data in many ways, but this guide does not show you how to store your
data and search it. Storing and searching your data is something you should carefully consider in
terms of your needs and your data format. However, here are some tips you might be able to
apply:</p>

  <ul>
    <li>If your data is stored in a SQLite database on the device, performing a full-text search
(using FTS3, rather than a {@code LIKE} query) can provide a more robust search across text data and
can produce results significantly faster. See <a href="http://sqlite.org/fts3.html">sqlite.org</a>
for information about FTS3 and the {@link android.database.sqlite.SQLiteDatabase} class for
information about SQLite on Android. Also look at the <a
href="{@docRoot}resources/samples/SearchableDictionary/index.html">Searchable Dictionary</a> sample
application to see a complete SQLite implementation that performs searches with FTS3.</li>
    <li>If your data is stored online, then the perceived search performance might be
inhibited by the user's data connection. You might want to display a spinning progress wheel until
your search returns. See {@link android.net} for a reference of network APIs and <a
href="{@docRoot}guide/topics/ui/dialogs.html#ProgressDialog">Creating a Progress Dialog</a>
for information about how to display a progress wheel.</li>
  </ul>


<div class="sidebox-wrapper">
<div class="sidebox">
<h2>About Adapters</h2>
<p>An {@link android.widget.Adapter} binds each item from a set of data into a
{@link android.view.View} object. When the {@link android.widget.Adapter}
is applied to a {@link android.widget.ListView}, each piece of data is inserted as an individual
view into the list. {@link
android.widget.Adapter} is just an interface, so implementations such as {@link
android.widget.CursorAdapter} (for binding data from a {@link android.database.Cursor}) are needed.
If none of the existing implementations work for your data, then you can implement your own from
{@link android.widget.BaseAdapter}. Install the SDK Samples package for API Level 4 to see the
original version of the Searchable Dictionary, which creates a custom adapter to read data from
a file.</p>
</div>
</div>

<p>Regardless of where your data lives and how you search it, we recommend that you return search
results to your searchable activity with an {@link android.widget.Adapter}. This way, you can easily
present all the search results in a {@link android.widget.ListView}. If your data comes from a
SQLite database query, you can apply your results to a {@link android.widget.ListView}
using a {@link android.widget.CursorAdapter}. If your data comes in some other type of format, then
you can create an extension of {@link android.widget.BaseAdapter}.</p>


<h4 id="PresentingTheResults">Presenting the results</h4>

<p>As discussed above, the recommended UI for your search results is a {@link
android.widget.ListView}, so you might want your searchable activity to extend {@link
android.app.ListActivity}. You can then call {@link
android.app.ListActivity#setListAdapter(ListAdapter) setListAdapter()}, passing it an {@link
android.widget.Adapter} that is bound to your data. This injects all the
search results into the activity {@link android.widget.ListView}.</p>

<p>For more help presenting your results in a list, see the {@link android.app.ListActivity}
documentation.</p>

<p>Also see the <a
href="{@docRoot}resources/samples/SearchableDictionary/index.html">Searchable Dictionary</a> sample
for an a complete demonstration of how to search an SQLite database and use an
{@link android.widget.Adapter} to provide results in a {@link android.widget.ListView}.</p>





<h2 id="SearchDialog">Using the Search Dialog</h2>

<div class="sidebox-wrapper">
<div class="sidebox">
  <h2>Should I use the search dialog or the widget?</h2>
  <p>The answer depends mostly on whether you are developing for Android 3.0 (API Level 11 or
higher), because the {@link android.widget.SearchView} widget was introduced in Android 3.0. So,
if you are developing your application for a version of Android lower than 3.0, the search widget is
not an option and you should use the search dialog to implement your search interface.</p>
  <p>If you <em>are</em> developing for Android 3.0 or higher, then the decision depends more on
your needs. In most cases, we recommend that you use the search widget as an "action view" in the
Action Bar. However, it might not be an option for you to put the search
widget in the Action Bar for some reason (perhaps there's not enough space or you don't use the
Action Bar). So, you might instead want to put the search widget somewhere in your activity layout.
And if all else fails, you can still use the search dialog if you prefer to keep the search box
hidden. In fact, you might want to offer both the dialog and the widget in some cases. For more
information about the widget, skip to <a href="#UsingSearchWidget">Using the Search Widget</a>.</p>
</div>
</div>

<p>The search dialog provides a floating search box at the top of the screen, with the application
icon on the left. The search dialog can provide search suggestions as the user types and, when
the user executes a search, the system sends the search query to a
searchable activity that performs the search. However, if you are developing
your application for devices running Android 3.0, you should consider using the search widget
instead (see the side box).</p>

<p>The search dialog is always hidden by default, until the user activates it. Your application
can activate the search dialog by calling {@link
android.app.Activity#onSearchRequested onSearchRequested()}. However, this method doesn't work
until you enable the search dialog for the activity.</p>

<p>To enable the search dialog, you must indicate to the system which searchable activity should
receive search queries from the search dialog, in order to perform searches. For example, in the
previous section about <a href="#SearchableActivity">Creating a Searchable Activity</a>, a
searchable activity named {@code SearchableActivity} was created. If you want a separate activity,
named {@code OtherActivity}, to show the search dialog and deliver searches to {@code
SearchableActivity}, you must declare in the manifest that {@code SearchableActivity} is the
searchable activity to use for the search dialog in {@code OtherActivity}.</p>

<p>To declare the searchable activity for an activity's search dialog,
add a <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data&gt;}</a>
element inside the respective activity's <a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a> element.
The <a href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data&gt;}</a>
element must include the {@code android:value} attribute that specifies the searchable activity's
class name and the {@code android:name} attribute with a value of {@code
"android.app.default_searchable"}.</p>

<p>For example, here is the declaration for
both a searchable activity, {@code SearchableActivity}, and another activity, {@code
OtherActivity}, which uses {@code SearchableActivity} to perform searches executed from its
search dialog:</p>

<pre>
&lt;application ... >
    &lt;!-- this is the searchable activity; it performs searches --&gt;
    &lt;activity android:name=".SearchableActivity" >
        &lt;intent-filter>
            &lt;action android:name="android.intent.action.SEARCH" />
        &lt;/intent-filter>
        &lt;meta-data android:name="android.app.searchable"
                   android:resource="@xml/searchable"/>
    &lt;/activity>

    &lt;!-- this activity enables the search dialog to initiate searches
         in the SearchableActivity --&gt;
    &lt;activity android:name=".OtherActivity" ... >
        &lt;!-- enable the search dialog to send searches to SearchableActivity -->
        <b>&lt;meta-data android:name="android.app.default_searchable"
                   android:value=".SearchableActivity" /&gt;</b>
    &lt;/activity>
    ...
&lt;/application>
</pre>

<p>Because the {@code OtherActivity} now includes a <a
href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data&gt;}</a>
element to declare which searchable activity to use for searches, the activity has enabled the
search dialog.
While the user is in this activity, the {@link
android.app.Activity#onSearchRequested onSearchRequested()} method activates the search dialog.
When the user executes the search, the system starts {@code SearchableActivity} and delivers it
the {@link android.content.Intent#ACTION_SEARCH} intent.</p>

<p class="note"><strong>Note:</strong> The searchable activity itself provides the search dialog
by default, so you don't need to add this declaration to {@code SearchableActivity}.</p>

<p>If you want every activity in your application to provide the search dialog, insert the above <a
href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data&gt;}</a>
element as a child of the <a
href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
element, instead of each <a
href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>. This
way, every activity inherits the value, provides the search dialog, and delivers searches to
the same searchable activity. (If you have multiple searchable activities, you can override the
default searchable activity by placing a different <a
href="{@docRoot}guide/topics/manifest/meta-data-element.html">{@code &lt;meta-data&gt;}</a>
declaration inside individual activities.)</p>

<p>With the search dialog now enabled for your activities, your application is ready to perform
searches.</p>


<h3 id="InvokingTheSearchDialog">Invoking the search dialog</h3>

<p>Although some devices provide a dedicated Search button, the behavior of the button may vary
between devices and many devices do not provide a Search button at all. So when using the search
dialog, you <strong>must provide a search button in your UI</strong> that activates the search
dialog by calling {@link android.app.Activity#onSearchRequested()}.</p>

<p>For instance, you should add a Search button in your <a
href="{@docRoot}guide/topics/ui/menus.html#options-menu">Options Menu</a> or UI
layout that calls {@link android.app.Activity#onSearchRequested()}. For consistency with
the Android system and other apps, you should label your button with the Android Search icon that's
available from the <a href="{@docRoot}design/downloads/index.html#action-bar-icon-pack">Action Bar
Icon Pack</a>.</p>

<p class="note"><strong>Note:</strong> If your app uses the <a
href="{@docRoot}guide/topics/ui/actionbar.html">action bar</a>, then you should not use
the search dialog for your search interface. Instead, use the <a href="#UsingSearchWidget">search
widget</a> as a collapsible view in the action bar.</p>

<p>You can also enable "type-to-search" functionality, which activates the search dialog when the
user starts typing on the keyboard&mdash;the keystrokes are inserted into the search dialog. You can
enable type-to-search in your activity by calling
{@link android.app.Activity#setDefaultKeyMode(int) setDefaultKeyMode}({@link
android.app.Activity#DEFAULT_KEYS_SEARCH_LOCAL}) during your activity's
{@link android.app.Activity#onCreate(Bundle) onCreate()} method.</p>


<h3 id="LifeCycle">The impact of the search dialog on your activity lifecycle</h3>

<p>The search dialog is a {@link android.app.Dialog} that floats at the top of the
screen. It does not cause any change in the activity stack, so when the search dialog appears, no
lifecycle methods (such as {@link android.app.Activity#onPause()}) are called. Your activity just
loses input focus, as input focus is given to the search dialog.
</p>

<p>If you want to be notified when the search dialog is activated, override the {@link
android.app.Activity#onSearchRequested()} method. When the system calls this method, it is an
indication that your activity has lost input focus to the search dialog, so you can do any
work appropriate for the event (such as pause
a game). Unless you are <a
href="#SearchContextData">passing search context data</a>
(discussed below), you should end the method by calling the super class implementation. For
example:</p>

<pre>
&#64;Override
public boolean onSearchRequested() {
    pauseSomeStuff();
    return super.onSearchRequested();
}
</pre>

<p>If the user cancels search by pressing the <em>Back</em> button, the search dialog closes and the
activity
regains input focus. You can register to be notified when the search dialog is
closed with {@link android.app.SearchManager#setOnDismissListener(SearchManager.OnDismissListener)
setOnDismissListener()}
and/or {@link android.app.SearchManager#setOnCancelListener(SearchManager.OnCancelListener)
setOnCancelListener()}. You
should need to register only the {@link android.app.SearchManager.OnDismissListener
OnDismissListener}, because it is called every time the search dialog closes. The {@link
android.app.SearchManager.OnCancelListener OnCancelListener} only pertains to events in which the
user explicitly exited the search dialog, so it is not called when a search is executed (in which
case, the search dialog naturally disappears).</p>

<p>If the current activity is not the searchable activity, then the normal activity lifecycle
events are triggered once the user executes a search (the current activity receives {@link
android.app.Activity#onPause()} and so forth, as
described in the <a
href="{@docRoot}guide/components/activities.html#Lifecycle">Activities</a>
document). If, however, the current activity is the searchable activity, then one of two
things happens:</p>

<ol type="a">
  <li>By default, the searchable activity receives the {@link
android.content.Intent#ACTION_SEARCH} intent with a call to {@link
android.app.Activity#onCreate(Bundle) onCreate()} and a new instance of the
activity is brought to the top of the activity stack. There are now two instances of your
searchable activity in the activity stack (so pressing the <em>Back</em> button goes back to the
previous
instance of the searchable activity, rather than exiting the searchable activity).</li>
  <li>If you set {@code android:launchMode} to <code>"singleTop"</code>, then the
searchable activity receives the {@link android.content.Intent#ACTION_SEARCH} intent with a call
to {@link android.app.Activity#onNewIntent(Intent)}, passing the new {@link
android.content.Intent#ACTION_SEARCH} intent here. For example, here's how you might handle
this case, in which the searchable activity's launch mode is <code>"singleTop"</code>:
<pre>
&#64;Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.search);
    handleIntent(getIntent());
}

&#64;Override
protected void onNewIntent(Intent intent) {
    setIntent(intent);
    handleIntent(intent);
}

private void handleIntent(Intent intent) {
    if (Intent.ACTION_SEARCH.equals(intent.getAction())) {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
}
</pre>

<p>Compared to the example code in the section about <a href="#PerformingSearch">Performing a
Search</a>, all the code to handle the
search intent is now in the {@code handleIntent()} method, so that both {@link
android.app.Activity#onCreate(Bundle)
onCreate()} and {@link android.app.Activity#onNewIntent(Intent) onNewIntent()} can execute it.</p>

<p>When the system calls {@link android.app.Activity#onNewIntent(Intent)}, the activity has
not been restarted, so the {@link android.app.Activity#getIntent()} method
returns the same intent that was received with {@link
android.app.Activity#onCreate(Bundle) onCreate()}. This is why you should call {@link
android.app.Activity#setIntent(Intent)} inside {@link
android.app.Activity#onNewIntent(Intent)} (so that the intent saved by the activity is updated in
case you call {@link android.app.Activity#getIntent()} in the future).</p>

</li>
</ol>

<p>The second scenario using <code>"singleTop"</code> launch mode is usually ideal, because chances
are good that once a search is done, the user will perform additional searches and it's a bad
experience if your application creates multiple instances of the searchable activity. So, we
recommend that you set your searchable activity to <code>"singleTop"</code> launch mode in the
application manifest. For example:</p>

<pre>
&lt;activity android:name=".SearchableActivity"
          <b>android:launchMode="singleTop"</b> >
    &lt;intent-filter>
        &lt;action android:name="android.intent.action.SEARCH" />
    &lt;/intent-filter>
    &lt;meta-data android:name="android.app.searchable"
                      android:resource="@xml/searchable"/>
  &lt;/activity>
</pre>



<h3 id="SearchContextData">Passing search context data</h3>

<p>In some cases, you can make necessary refinements to the search query inside the searchable
activity, for every search made. However, if you want to refine your search criteria based on the
activity from which the user is performing a search, you can provide additional data in the intent
that the system sends to your searchable activity. You can pass the additional data in the {@link
android.app.SearchManager#APP_DATA} {@link android.os.Bundle}, which is included in the {@link
android.content.Intent#ACTION_SEARCH} intent.</p>

<p>To pass this kind of data to your searchable activity, override the {@link
android.app.Activity#onSearchRequested()} method for the activity from which the user can perform a
search, create a {@link android.os.Bundle} with the additional data, and call {@link
android.app.Activity#startSearch startSearch()} to activate the search dialog.
For example:</p>

<pre>
&#64;Override
public boolean onSearchRequested() {
     Bundle appData = new Bundle();
     appData.putBoolean(SearchableActivity.JARGON, true);
     startSearch(null, false, appData, false);
     return true;
 }
</pre>

<p>Returning "true" indicates that you have successfully handled this callback event and
called {@link android.app.Activity#startSearch startSearch()} to activate
the search dialog. Once the user submits a query, it's delivered to your
searchable activity along with the data you've added. You can extract the extra data from the {@link
android.app.SearchManager#APP_DATA} {@link android.os.Bundle} to refine the search. For example:</p>

<pre>
Bundle appData = getIntent().getBundleExtra(SearchManager.APP_DATA);
if (appData != null) {
    boolean jargon = appData.getBoolean(SearchableActivity.JARGON);
}
</pre>

<p class="caution"><strong>Caution:</strong> Never call the {@link
android.app.Activity#startSearch(String,boolean,Bundle,boolean) startSearch()} method from outside
the {@link android.app.Activity#onSearchRequested()} callback method. To activate the search dialog
in your activity, always call {@link android.app.Activity#onSearchRequested()}. Otherwise, {@link
android.app.Activity#onSearchRequested()} is not called and customizations (such as the addition of
{@code appData} in the above example) are missed.</p>



<h2 id="UsingSearchWidget">Using the Search Widget</h2>

<div class="figure" style="width:429px;margin:0">
  <img src="{@docRoot}images/ui/actionbar-actionview.png" alt="" />
  <p class="img-caption"><strong>Figure 2.</strong> The {@link
android.widget.SearchView} widget as an "action view" in the Action Bar.</p>
</div>

<p>The {@link android.widget.SearchView} widget is available in Android 3.0 and higher. If
you're developing your application for Android 3.0 and have decided to use the search widget, we
recommend that you insert the search widget as an <a
href="{@docRoot}guide/topics/ui/actionbar.html#ActionView">action view in the Action Bar</a>,
instead of using the search dialog (and instead of placing the search widget in your activity
layout). For example, figure 2 shows the search widget in the Action Bar.</p>

<p>The search widget provides the same functionality as the search dialog. It starts the appropriate
activity when the user executes a search, and it can provide search suggestions and perform voice
search.</p>

<p class="note"><strong>Note:</strong> When you use the search widget as an action view, you
still might need to support using the search dialog, for cases in which the search widget does
not fit in the Action Bar. See the following section about <a href="#UsingBoth">Using both
the widget and the dialog</a>.</p>


<h3 id="ConfiguringWidget">Configuring the search widget</h3>

<p>After you've created a  <a href="#SearchableConfiguration">searchable configuration</a> and a <a
href="#SearchableActivity">searchable activity</a>, as discussed above, you need to enable assisted
search for each {@link android.widget.SearchView}. You can do so by calling {@link
android.widget.SearchView#setSearchableInfo setSearchableInfo()} and passing it the {@link
android.app.SearchableInfo} object that represents your searchable configuration.</p>

<p>You can get a reference to the {@link android.app.SearchableInfo} by calling {@link
android.app.SearchManager#getSearchableInfo getSearchableInfo()} on {@link
android.app.SearchManager}.</p>

<p>For example, if you're using a {@link android.widget.SearchView} as an action view in the <a
href="{@docRoot}guide/topics/ui/actionbar.html">Action Bar</a>, you should enable the widget
during the {@link android.app.Activity#onCreateOptionsMenu onCreateOptionsMenu()} callback:</p>

<pre>
&#64;Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the options menu from XML
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.options_menu, menu);

    // Get the SearchView and set the searchable configuration
    SearchManager searchManager = (SearchManager) {@link android.app.Activity#getSystemService getSystemService}(Context.SEARCH_SERVICE);
    SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView();
    // Assumes current activity is the searchable activity
    searchView.setSearchableInfo(searchManager.getSearchableInfo({@link android.app.Activity#getComponentName()}));
    searchView.setIconifiedByDefault(false); // Do not iconify the widget; expand it by default

    return true;
}
</pre>

<p>That's all you need. The search widget is now configured and the system will deliver search
queries to your searchable activity. You can also enable <a href="#SearchSuggestions">search
suggestions</a> for the search widget.</p>

<p class="note"><strong>Note:</strong> If you want to handle all user input yourself, you can do so
with some callback methods and event listeners. For more information, see the reference
documentation for {@link android.widget.SearchView} and its nested interfaces for the
appropriate event listeners.</p>

<p>For more information about action views in the Action Bar, read the <a
href="{@docRoot}guide/topics/ui/actionbar.html#ActionView">Action Bar</a> developer guide (which
includes sample code for adding a search widget as an action view).</p>


<h3 id="WidgetFeatures">Other search widget features</h3>

<p>The {@link android.widget.SearchView} widget allows for a few additional features you might
want:</p>

<dl>
  <dt>A submit button</dt>
  <dd>By default, there's no button to submit a search query, so the user must press the
"Return" key on the keyboard to initiate a search. You can add a "submit" button by calling
{@link android.widget.SearchView#setSubmitButtonEnabled setSubmitButtonEnabled(true)}.</dd>
  <dt>Query refinement for search suggestions</dt>
  <dd>When you've enabled search suggestions, you usually expect users to simply select a
suggestion, but they might also want to refine the suggested search query. You can add a button
alongside each suggestion that inserts the suggestion in the search box for refinement by the
user, by calling {@link android.widget.SearchView#setQueryRefinementEnabled
setQueryRefinementEnabled(true)}.</dd>
  <dt>The ability to toggle the search box visibility</dt>
  <dd>By default, the search widget is "iconified," meaning that it is represented only by a
search icon (a magnifying glass), and expands to show the search box when the user touches it.
As shown above, you can show the search box by default, by calling {@link
android.widget.SearchView#setIconifiedByDefault setIconifiedByDefault(false)}. You can also
toggle the search widget appearance by calling {@link android.widget.SearchView#setIconified
setIconified()}.</dd>
</dl>

<p>There are several other APIs in the {@link android.widget.SearchView} class that allow you to
customize the search widget. However, most of them are used only when you handle all
user input yourself, instead of using the Android system to deliver search queries and display
search suggestions.</p>


<h3 id="UsingBoth">Using both the widget and the dialog</h3>

<p>If you insert the search widget in the Action Bar as an <a
href="{@docRoot}guide/topics/ui/actionbar.html#ActionView">action view</a>, and you enable it to
appear in the Action Bar "if there is room" (by setting {@code
android:showAsAction="ifRoom"}), then there is a chance that the search widget will not appear
as an action view, but the menu item will appear in the overflow menu. For example, when your
application runs on a smaller screen, there might not be enough room in the Action Bar to display
the search widget along with other action items or navigation elements, so the menu item will
instead appear in the overflow menu. When placed in the overflow menu, the item works like an
ordinary menu item and does not display the action view (the search widget).</p>

<p>To handle this situation, the menu item to which you've attached the search widget should
activate the search dialog when the user selects it from the overflow menu. In order for it to do
so, you must implement {@link android.app.Activity#onOptionsItemSelected onOptionsItemSelected()} to
handle the "Search" menu item and open the search dialog by calling {@link
android.app.Activity#onSearchRequested onSearchRequested()}.</p>

<p>For more information about how items in the Action Bar work and how to handle this situation, see
the <a href="{@docRoot}guide/topics/ui/actionbar.html">Action
Bar</a> developer guide.</p>

<p>Also see the <a
href="{@docRoot}resources/samples/SearchableDictionary/src/com/example/android/searchabledict/SearchableDictionary.html"
>Searchable Dictionary</a> for an example implementation using
both the dialog and the widget.</p>



<h2 id="VoiceSearch">Adding Voice Search</h2>

<p>You can add voice search functionality to your search dialog or widget by adding the {@code
android:voiceSearchMode} attribute to your searchable configuration. This adds a voice search
button that launches a voice prompt. When the user
has finished speaking, the transcribed search query is sent to your searchable
activity.</p>

<p>For example:</p>

<pre>
&lt;?xml version="1.0" encoding="utf-8"?>
&lt;searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/search_label"
    android:hint="@string/search_hint"
    <b>android:voiceSearchMode="showVoiceSearchButton|launchRecognizer"</b> >
&lt;/searchable>
</pre>

<p>The value {@code showVoiceSearchButton} is required to enable voice
search, while the second value, {@code launchRecognizer}, specifies that the voice search button
should launch a recognizer that returns the transcribed text to the searchable activity.</p>

<p>You can provide additional attributes to specify the voice search behavior, such
as the language to be expected and the maximum number of results to return. See the <a
href="searchable-config.html">Searchable Configuration</a> reference for more information about the
available attributes.</p>

<p class="note"><strong>Note:</strong> Carefully consider whether voice search is appropriate for
your application. All searches performed with the voice search button are immediately sent to
your searchable activity without a chance for the user to review the transcribed query. Sufficiently
test the voice recognition and ensure that it understands the types of queries that
the user might submit inside your application.</p>



<h2 id="SearchSuggestions">Adding Search Suggestions</h2>

<div class="figure" style="width:250px;margin:0">
<img src="{@docRoot}images/search/search-suggest-custom.png" alt="" height="417" />
<p class="img-caption"><strong>Figure 3.</strong> Screenshot of a search dialog with custom
search suggestions.</p>
</div>

<p>Both the search dialog and the search widget can provide search suggestions as the user
types, with assistance from the Android system. The system manages the list of suggestions and
handles the event when the user selects a suggestion.</p>

<p>You can provide two kinds of search suggestions:</p>

<dl>
  <dt>Recent query search suggestions</dt>
  <dd>These suggestions are simply words that the user previously used as search queries in
your application.
  <p>See <a href="adding-recent-query-suggestions.html">Adding Recent Query
Suggestions</a>.</p></dd>
  <dt>Custom search suggestions</dt>
  <dd>These are search suggestions that you provide from your own data source, to help users
immediately select the correct spelling or item they are searching for. Figure 3 shows an
example of custom suggestions for a dictionary application&mdash;the user can select a suggestion
to instantly go to the definition.
  <p>See <a href="adding-custom-suggestions.html">Adding Custom
Suggestions</a></p></dd>
</dl>

