blob: 5f4799c75eb04f576f2e4376ca949f6f997e1e1f [file] [log] [blame]
page.title=Creating a Background Service
trainingnavtop=true
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>This lesson teaches you to</h2>
<ol>
<li>
<a href="#CreateClass">Create an IntentService</a>
</li>
<li>
<a href="#DefineManifest">Define the IntentService in the Manifest</a>
</li>
</ol>
<h2>You should also read</h2>
<ul>
<li>
<a href="{@docRoot}guide/components/services.html#ExtendingIntentService">Extending the IntentService Class</a>
</li>
<li>
<a href="{@docRoot}guide/components/intents-filters.html">Intents and Intent Filters</a>
</li>
</ul>
<h2>Try it out</h2>
<div class="download-box">
<a href="{@docRoot}shareables/training/ThreadSample.zip" class="button">Download the sample</a>
<p class="filename">ThreadSample.zip</p>
</div>
</div>
</div>
<p>
The {@link android.app.IntentService} class provides a straightforward structure for running
an operation on a single background thread. This allows it to handle long-running operations
without affecting your user interface's responsiveness. Also, an
{@link android.app.IntentService} isn't affected by most user interface lifecycle events, so it
continues to run in circumstances that would shut down an {@link android.os.AsyncTask}
</p>
<p>
An {@link android.app.IntentService} has a few limitations:
</p>
<ul>
<li>
It can't interact directly with your user interface. To put its results in the UI, you
have to send them to an {@link android.app.Activity}.
</li>
<li>
Work requests run sequentially. If an operation is running in an
{@link android.app.IntentService}, and you send it another request, the request waits until
the first operation is finished.
</li>
<li>
An operation running on an {@link android.app.IntentService} can't be interrupted.
</li>
</ul>
<p>
However, in most cases an {@link android.app.IntentService} is the preferred way to simple
background operations.
</p>
<p>
This lesson shows you how to create your own subclass of {@link android.app.IntentService}.
The lesson also shows you how to create the required callback method
{@link android.app.IntentService#onHandleIntent onHandleIntent()}. Finally, the lesson describes
shows you how to define the {@link android.app.IntentService} in your manifest file.
</p>
<h2 id="CreateClass">Create an IntentService</h2>
<p>
To create an {@link android.app.IntentService} component for your app, define a class that
extends {@link android.app.IntentService}, and within it, define a method that
overrides {@link android.app.IntentService#onHandleIntent onHandleIntent()}. For example:
</p>
<pre>
public class RSSPullService extends IntentService {
&#64;Override
protected void onHandleIntent(Intent workIntent) {
// Gets data from the incoming Intent
String dataString = workIntent.getDataString();
...
// Do work here, based on the contents of dataString
...
}
}
</pre>
<p>
Notice that the other callbacks of a regular {@link android.app.Service} component, such as
{@link android.app.Service#onStartCommand onStartCommand()} are automatically invoked by
{@link android.app.IntentService}. In an {@link android.app.IntentService}, you should avoid
overriding these callbacks.
</p>
<h2 id="DefineManifest">Define the IntentService in the Manifest</h2>
<p>
An {@link android.app.IntentService} also needs an entry in your application manifest.
Provide this entry as a
<code><a href="{@docRoot}guide/topics/manifest/service-element.html">&lt;service&gt;</a></code>
element that's a child of the
<code><a href="{@docRoot}guide/topics/manifest/application-element.html">
&lt;application&gt;</a></code> element:
</p>
<pre>
&lt;application
android:icon="&#64;drawable/icon"
android:label="&#64;string/app_name"&gt;
...
&lt;!--
Because android:exported is set to "false",
the service is only available to this app.
--&gt;
&lt;service
android:name=".RSSPullService"
android:exported="false"/&gt;
...
&lt;application/&gt;
</pre>
<p>
The attribute <code>android:name</code> specifies the class name of the
{@link android.app.IntentService}.
</p>
<p>
Notice that the
<code><a href="{@docRoot}guide/topics/manifest/service-element.html">&lt;service&gt;</a></code>
element doesn't contain an intent filter. The {@link android.app.Activity} that sends work
requests to the service uses an explicit {@link android.content.Intent}, so no filter is needed.
This also means that only components in the same app or other applications with the same user ID
can access the service.
</p>
<p>
Now that you have the basic {@link android.app.IntentService} class, you can send work requests
to it with {@link android.content.Intent} objects. The procedure for constructing these objects
and sending them to your {@link android.app.IntentService} is described in the next lesson.
</p>