f0f5efbea2
Change-Id: I002af57c65eccd0a624e00ef4b1607469199ce6b
132 lines
5.0 KiB
Plaintext
132 lines
5.0 KiB
Plaintext
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 {
|
|
@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"><service></a></code>
|
|
element that's a child of the
|
|
<code><a href="{@docRoot}guide/topics/manifest/application-element.html">
|
|
<application></a></code> element:
|
|
</p>
|
|
<pre>
|
|
<application
|
|
android:icon="@drawable/icon"
|
|
android:label="@string/app_name">
|
|
...
|
|
<!--
|
|
Because android:exported is set to "false",
|
|
the service is only available to this app.
|
|
-->
|
|
<service
|
|
android:name=".RSSPullService"
|
|
android:exported="false"/>
|
|
...
|
|
<application/>
|
|
</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"><service></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>
|