1page.title=Serviços
2@jd:body
3
4<div id="qv-wrapper">
5<ol id="qv">
6<h2>Neste documento</h2>
7<ol>
8<li><a href="#Basics">Conceitos básicos</a></li>
9<ol>
10  <li><a href="#Declaring">Declaração de serviço no manifesto</a></li>
11</ol>
12<li><a href="#CreatingAService">Criação de serviço iniciado</a>
13  <ol>
14    <li><a href="#ExtendingIntentService">Extensão da classe IntentService</a></li>
15    <li><a href="#ExtendingService">Extensão da classe Service</a></li>
16    <li><a href="#StartingAService">Início de serviço</a></li>
17    <li><a href="#Stopping">Interrupção de serviço</a></li>
18  </ol>
19</li>
20<li><a href="#CreatingBoundService">Criação de serviço vinculado</a></li>
21<li><a href="#Notifications">Envio de notificações ao usuário</a></li>
22<li><a href="#Foreground">Execução de serviço em primeiro plano</a></li>
23<li><a href="#Lifecycle">Gerenciamento do ciclo de vida de um serviço</a>
24<ol>
25  <li><a href="#LifecycleCallbacks">Implementação dos retornos de chamada do ciclo de vida</a></li>
26</ol>
27</li>
28</ol>
29
30<h2>Classes principais</h2>
31<ol>
32  <li>{@link android.app.Service}</li>
33  <li>{@link android.app.IntentService}</li>
34</ol>
35
36<h2>Exemplos</h2>
37<ol>
38  <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.html">{@code
39      ServiceStartArguments}</a></li>
40  <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code
41      LocalService}</a></li>
42</ol>
43
44<h2>Veja também</h2>
45<ol>
46<li><a href="{@docRoot}guide/components/bound-services.html">Serviços vinculados</a></li>
47</ol>
48
49</div>
50
51
52<p>Um {@link android.app.Service} é um componente do aplicativo que pode realizar
53operações longas e não fornece uma interface do usuário. Outro componente do aplicativo
54pode iniciar um serviço e ele continuará em execução em segundo plano mesmo que o usuário
55alterne para outro aplicativo. Além disso, um componente poderá vincular-se a um serviço
56para interagir com ele e até estabelecer comunicação entre processos (IPC). Por exemplo, um serviço pode lidar
57com operações de rede, reproduzir música, executar E/S de arquivos, ou interagir com um provedor de conteúdo,
58tudo a partir do segundo plano.</p>
59
60<p>Um serviço pode essencialmente ter duas formas:</p>
61
62<dl>
63  <dt>Iniciado</dt>
64  <dd>Um serviço é "iniciado" quando um componente do aplicativo (como um atividade)
65inicia-o chamando {@link android.content.Context#startService startService()}. Quando iniciado, um serviço
66pode ficar em execução em segundo plano indefinidamente, mesmo que o componente que o iniciou seja destruído. Geralmente,
67um serviço iniciado realiza uma única operação e não retorna um resultado para o autor da chamada.
68Por exemplo, ele pode fazer download ou upload de um arquivo pela rede. Quando a operação for concluída,
69o serviço deverá ser interrompido.</dd>
70  <dt>Vinculado</dt>
71  <dd>Um serviço é "vinculado" quando um componente do aplicativo o vincula chamando {@link
72android.content.Context#bindService bindService()}. Um serviço vinculado oferece uma interface
73servidor-cliente que permite que os componentes interajam com a interface, enviem solicitações, obtenham resultados,
74mesmo em processos com comunicação interprocessual (IPC). Um serviço vinculado permanece em execução somente enquanto
75outro componente do aplicativo estiver vinculado a ele. Vários componentes podem ser vinculados ao serviço de uma só vez,
76mas quando todos desfizerem o vínculo, o serviço será destruído.</dd>
77</dl>
78
79<p>Apesar de esta documentação discutir os dois tipos de serviços separadamente,
80um serviço pode funcionar das duas maneiras &mdash; ele pode ser iniciado (para permanecer em execução indefinidamente) e também permitir a vinculação.
81Basta você implementar alguns métodos de retorno de chamada: {@link
82android.app.Service#onStartCommand onStartCommand()} para permitir que os componentes iniciem o serviço e {@link
83android.app.Service#onBind onBind()} para permitir a vinculação.</p>
84
85<p>Se o aplicativo for iniciado, vinculado ou ambos, qualquer componente do aplicativo
86poderá usar o serviço (mesmo a partir de um aplicativo separado), da mesma forma que qualquer componente poderá usar
87uma atividade &mdash; iniciando com uma {@link android.content.Intent}. No entanto, é possível declarar
88o serviço como privado, no arquivo do manifesto, e bloquear o acesso de outros aplicativos. Isto é discutido com mais detalhes
89na seção <a href="#Declaring">Declaração do serviço
90no manifesto</a>.</p>
91
92<p class="caution"><strong>Atenção:</strong> um serviço é executado
93no encadeamento principal em seu processo de hospedagem &mdash; o serviço <strong>não</strong> cria seu próprio encadeamento
94e <strong>não</strong> é executado em um processo separado (salvo se especificado). Isso significa que,
95 se o serviço for realizar qualquer trabalho intensivo de CPU ou operações de bloqueio (como reprodução
96de MP3 ou rede), você deve criar um novo encadeamento dentro do serviço. Usando um encadeamento separado,
97você reduzirá o risco da ocorrência de erros de Aplicativo não respondendo (ANR)
98e o encadeamento principal do aplicativo poderá permanecer dedicado à interação do usuário com as atividades.</p>
99
100
101<h2 id="Basics">Conceitos básicos</h2>
102
103<div class="sidebox-wrapper">
104<div class="sidebox">
105  <h3>Você deve usar um serviço ou um encadeamento?</h3>
106  <p>Um serviço é simplesmente um componente que pode ser executado em segundo plano mesmo quando o usuário
107não está interagindo com o aplicativo. Portanto, um serviço deve ser criado somente
108se for realmente necessário.</p>
109  <p>Caso precise realizar trabalhos fora do encadeamento principal, mas somente enquanto o usuário estiver interagindo
110com o aplicativo, então você deve criar um novo encadeamento e não um serviço. Por exemplo,
111se quiser reproduzir músicas, mas somente enquanto a atividade estiver em execução, você pode criar um encadeamento
112em {@link android.app.Activity#onCreate onCreate()}, iniciando a execução em {@link
113android.app.Activity#onStart onStart()}, e interrompendo em {@link android.app.Activity#onStop
114onStop()}. Considere também usar {@link android.os.AsyncTask} ou {@link android.os.HandlerThread},
115em vez de a classe tradicional {@link java.lang.Thread}. Consulte o documento <a href="{@docRoot}guide/components/processes-and-threads.html#Threads">Processos e
116encadeamentos</a> para obter mais informações sobre encadeamentos.</p>
117  <p>Lembre-se de que, se usar um serviço, ele ainda será executado no encadeamento principal do aplicativo por padrão,
118portanto deve-se criar um novo encadeamento dentro do serviço se ele realizar operações
119intensivas ou de bloqueio.</p>
120</div>
121</div>
122
123<p>Para criar um serviço, você deve criar uma subclasse de {@link android.app.Service}
124(ou uma das subclasses existentes). Na implementação, será necessário substituir alguns métodos de retorno de chamada
125que lidem com aspectos essenciais do ciclo de vida do serviço e forneçam um mecanismo para vincular
126componentes ao serviço, se apropriado. Os dois métodos mais importantes de retorno de chamada que você deve substituir são:</p>
127
128<dl>
129  <dt>{@link android.app.Service#onStartCommand onStartCommand()}</dt>
130    <dd>O sistema chama este método quando outro componente, como uma atividade,
131solicita que o serviço seja iniciado, chamando {@link android.content.Context#startService
132startService()}. Quando este método é executado, o serviço é iniciado e pode ser executado
133em segundo plano indefinidamente. Se implementar isto, é de sua responsabilidade interromper o serviço
134quando o trabalho for concluído, chamando {@link android.app.Service#stopSelf stopSelf()} ou {@link
135android.content.Context#stopService stopService()} (caso queira somente fornecer a vinculação,
136não é necessário implementar este método).</dd>
137  <dt>{@link android.app.Service#onBind onBind()}</dt>
138    <dd>O sistema chama este método quando outro componente quer vincular-se
139ao serviço (como para realizações de RPC) chamando {@link android.content.Context#bindService
140bindService()}. Na implementação deste método, você deve fornecer uma interface que os clientes
141usem para comunicar-se com o serviço, retornando um {@link android.os.IBinder}. Você sempre deve implementar este método,
142mas, se não quiser permitir a vinculação, retorne nulo.</dd>
143  <dt>{@link android.app.Service#onCreate()}</dt>
144    <dd>O sistema chama este método quando o serviço é criado pela primeira vez para realizar procedimentos únicos
145de configuração (antes de chamar {@link android.app.Service#onStartCommand onStartCommand()} ou
146{@link android.app.Service#onBind onBind()}). Se o serviço já estiver em execução, este método
147não é chamado.</dd>
148  <dt>{@link android.app.Service#onDestroy()}</dt>
149    <dd>O sistema chama este método quando o serviço não é mais usado e está sendo destruído.
150O serviço deve implementar isto para limpar quaisquer recursos, como encadeamentos, escutas
151registradas, receptores etc. Esta é a última chamada que o serviço recebe.</dd>
152</dl>
153
154<p>Se um componente iniciar o serviço chamando {@link
155android.content.Context#startService startService()} (o que resulta em uma chamada para {@link
156android.app.Service#onStartCommand onStartCommand()}),
157o serviço permanecerá em execução até ser interrompido por conta própria com {@link android.app.Service#stopSelf()} ou por outro componente
158chamando {@link android.content.Context#stopService stopService()}.</p>
159
160<p>Se um componente
161chamar {@link android.content.Context#bindService bindService()} para criar o serviço (e {@link
162android.app.Service#onStartCommand onStartCommand()} <em>não</em> for chamado), o serviço será executado
163somente enquanto o componente estiver vinculado a ele. Quando o serviço for desvinculado de todos os clientes,
164o sistema o destruirá.</p>
165
166<p>O sistema Android forçará a interrupção de um serviço somente quando a memória estiver baixa e precisar
167recuperar os recursos do sistema para a atividade com que o usuário estiver interagindo. Se o serviço estiver vinculado a uma atividade que o usuário
168tenha atribuído foco, é menos provável que ele seja eliminado. E, se o serviço for declarado para <a href="#Foreground">ser executado em primeiro plano</a> (discutido posteriormente), então ele quase nunca será eliminado.
169Caso contrário, se o serviço for iniciado e estiver em uma longa execução, o sistema reduzirá sua posição
170na lista de tarefas de segundo plano no decorrer do tempo e o serviço se tornará altamente suscetível
171à eliminação &mdash; se o serviço for iniciado, então você deve programá-lo para lidar
172com reinicializações pelo sistema. Se o sistema eliminar o seu serviço, ele reiniciará assim que os recursos
173estiverem disponíveis novamente (apesar de isto também depender do valor que você retornar de {@link
174android.app.Service#onStartCommand onStartCommand()}, como discutido a seguir). Para obter mais informações sobre
175quando o sistema deve destruir um serviço, consulte o documento <a href="{@docRoot}guide/components/processes-and-threads.html">Processos e encadeamentos</a>
176.</p>
177
178<p>Nas seguintes seções, você verá como é possível criar cada tipo de serviço e como
179usá-los a partir de outros componentes do aplicativo.</p>
180
181
182
183<h3 id="Declaring">Declaração de serviço no manifesto</h3>
184
185<p>Como atividades (e outros componentes), você deve declarar todos os serviços no arquivo de manifesto
186do aplicativo.</p>
187
188<p>Para declarar o serviço, adicione um elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a>
189como filho do elemento <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
190. Por exemplo:</p>
191
192<pre>
193&lt;manifest ... &gt;
194  ...
195  &lt;application ... &gt;
196      &lt;service android:name=".ExampleService" /&gt;
197      ...
198  &lt;/application&gt;
199&lt;/manifest&gt;
200</pre>
201
202<p>Consulte a referência de elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a>
203para obter mais informações sobre como declarar o serviço no manifesto.</p>
204
205<p>É possível incluir outros atributos no elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a>
206para definir propriedades como permissões necessárias para iniciar o serviço e o processo
207em que o serviço deve ser executado. O atributo <a href="{@docRoot}guide/topics/manifest/service-element.html#nm">{@code android:name}</a>
208é o único necessário &mdash; ele especifica o nome da classe do serviço. Ao publicar o aplicativo,
209 não deve-se alterar-lhe o nome porque, se isso acontecer, há riscos de ocorrência de erros
210de código devido à dependência de intenções explícitas para iniciar ou vincular o serviço (leia a publicação do blogue, <a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Coisas
211que não podem mudar</a>).
212
213<p>Para garantir a segurança do aplicativo, <strong>sempre use uma intenção explícita ao iniciar ou vincular
214{@link android.app.Service}</strong> e não declare filtros de intenção para o serviço. Caso seja essencial permitir alguma ambiguidade, como qual serviço deve ser usado para iniciar,
215é possível fornecer filtros de intenções
216para os serviços e excluir o nome do componente de {@link
217android.content.Intent}, mas é preciso definir o pacote para a intenção com {@link
218android.content.Intent#setPackage setPackage()}, que fornece desambiguidade suficiente para
219o serviço alvo.</p>
220
221<p>Além disso, é possível garantir que o serviço esteja disponível somente para o aplicativo
222incluindo o atributo <a href="{@docRoot}guide/topics/manifest/service-element.html#exported">{@code android:exported}</a>
223e definindo-o como {@code "false"}. Isto impede efetivamente que outros aplicativos iniciem o serviço,
224 mesmo usando uma intenção explícita.</p>
225
226
227
228
229<h2 id="CreatingStartedService">Criação de um serviço iniciado</h2>
230
231<p>Um serviço iniciado é o que outro componente inicia chamando {@link
232android.content.Context#startService startService()}, resultando em uma chamada para o método
233{@link android.app.Service#onStartCommand onStartCommand()} do serviço.</p>
234
235<p>Quando um serviço é iniciado, ele tem um ciclo de vida que não depende do componente
236que o iniciou. Além disso, o serviço pode ser executado em segundo plano indefinidamente,
237mesmo se o componente que o iniciou for eliminado. Além disso, o serviço deve ser interrompido quando o seu trabalho
238for realizado, chamando {@link android.app.Service#stopSelf stopSelf()}. Outros componentes podem interrompê-lo
239chamando {@link android.content.Context#stopService stopService()}.</p>
240
241<p>Um componente do aplicativo, como uma atividade, pode iniciar o serviço chamando {@link
242android.content.Context#startService startService()} e passando {@link android.content.Intent},
243que especifica o serviço e inclui os dados para o serviço usar. O serviço
244recebe esta {@link android.content.Intent} no método {@link android.app.Service#onStartCommand
245onStartCommand()}.</p>
246
247<p>Por exemplo, presuma que uma atividade precise salvar alguns dados em um banco de dados on-line. A atividade pode iniciar
248um serviço de acompanhamento e entregar a ele os dados a salvar passando uma intenção para {@link
249android.content.Context#startService startService()}. O serviço recebe a intenção em {@link
250android.app.Service#onStartCommand onStartCommand()}, conecta-se à Internet e realiza
251a transação no banco de dados. Quando a operação é concluída, o serviço é interrompido
252e destruído.</p>
253
254<p class="caution"><strong>Atenção:</strong> um serviço é executado no mesmo processo que o aplicativo
255em que ele é declarado e no encadeamento principal do aplicativo, por padrão. Portanto, se o serviço
256realizar operações intensivas ou de bloqueio quando o usuário interagir com uma atividade do mesmo aplicativo,
257diminuirá o desempenho da atividade. Para evitar impacto no desempenho do aplicativo,
258deve-se iniciar um novo encadeamento dentro do serviço.</p>
259
260<p>Geralmente, há duas classes que podem ser estendidas para criar um serviço iniciado:</p>
261<dl>
262  <dt>{@link android.app.Service}</dt>
263  <dd>Esta é a classe de base para todos os serviços. Ao estender esta classe, é importante
264criar um novo encadeamento para fazer todo o trabalho do serviço, pois o serviço usa
265o encadeamento principal do aplicativo, por padrão, o que deve diminuir o desempenho de qualquer atividade
266que o aplicativo estiver executando.</dd>
267  <dt>{@link android.app.IntentService}</dt>
268  <dd>Esta é uma subclasse de {@link android.app.Service} que usa um encadeamento de trabalho para lidar
269com todas as solicitações de inicialização, uma por vez. Esta é a melhor opção se não quiser que o serviço
270lide com várias solicitações simultaneamente. Tudo que precisa fazer é implementar {@link
271android.app.IntentService#onHandleIntent onHandleIntent()}, que recebe a intenção para cada solicitação
272de início para que você possa realizar o trabalho de segundo plano.</dd>
273</dl>
274
275<p>As seguintes seções descrevem como é possível implementar o serviço usando
276uma dessas classes.</p>
277
278
279<h3 id="ExtendingIntentService">Extensão da classe IntentService</h3>
280
281<p>Como a maioria dos serviços não precisam lidar com várias solicitações simultaneamente
282(o que pode ser perigoso para situações de vários encadeamentos), é melhor
283se o serviço for implementado usando a classe {@link android.app.IntentService}.</p>
284
285<p>O {@link android.app.IntentService} faz o seguinte:</p>
286
287<ul>
288  <li>Cria um encadeamento de trabalho padrão que executa todas as intenções entregues a {@link
289android.app.Service#onStartCommand onStartCommand()} separado do encadeamento principal
290do aplicativo.</li>
291  <li>Cria uma fila de trabalho que passa uma intenção por vez à implementação {@link
292android.app.IntentService#onHandleIntent onHandleIntent()}, para que nunca seja necessário
293preocupar-se com vários encadeamentos.</li>
294  <li>Interrompe o serviço depois que todas as solicitações forem resolvidas para que não seja necessário chamar
295{@link android.app.Service#stopSelf}.</li>
296  <li>Fornece implementações padrão de {@link android.app.IntentService#onBind onBind()}
297que retornam como nulo.</li>
298  <li>Fornece uma implementação padrão de {@link android.app.IntentService#onStartCommand
299onStartCommand()} que envia a intenção para a fila de trabalho e, em seguida, para a implementação de {@link
300android.app.IntentService#onHandleIntent onHandleIntent()}.</li>
301</ul>
302
303<p>Tudo isso adiciona-se ao fato de que basta implementar {@link
304android.app.IntentService#onHandleIntent onHandleIntent()} para fazer o trabalho fornecido
305pelo cliente (embora também seja necessário fornecer um pequeno construtor para o serviço).</p>
306
307<p>A seguir há um exemplo de implementação de {@link android.app.IntentService}:</p>
308
309<pre>
310public class HelloIntentService extends IntentService {
311
312  /**
313   * A constructor is required, and must call the super {@link android.app.IntentService#IntentService}
314   * constructor with a name for the worker thread.
315   */
316  public HelloIntentService() {
317      super("HelloIntentService");
318  }
319
320  /**
321   * The IntentService calls this method from the default worker thread with
322   * the intent that started the service. When this method returns, IntentService
323   * stops the service, as appropriate.
324   */
325  &#64;Override
326  protected void onHandleIntent(Intent intent) {
327      // Normally we would do some work here, like download a file.
328      // For our sample, we just sleep for 5 seconds.
329      long endTime = System.currentTimeMillis() + 5*1000;
330      while (System.currentTimeMillis() &lt; endTime) {
331          synchronized (this) {
332              try {
333                  wait(endTime - System.currentTimeMillis());
334              } catch (Exception e) {
335              }
336          }
337      }
338  }
339}
340</pre>
341
342<p>É tudo que você precisa: um construtor e uma implementação de {@link
343android.app.IntentService#onHandleIntent onHandleIntent()}.</p>
344
345<p>Caso decida substituir outros métodos de retorno de chamada, como {@link
346android.app.IntentService#onCreate onCreate()}, {@link
347android.app.IntentService#onStartCommand onStartCommand()} ou {@link
348android.app.IntentService#onDestroy onDestroy()}, certifique-se de chamar a super-implementação
349para que o {@link android.app.IntentService} possa lidar adequadamente com a vida do encadeamento de trabalho.</p>
350
351<p>Por exemplo, {@link android.app.IntentService#onStartCommand onStartCommand()} deve retornar
352a implementação padrão (que é como a intenção é entregue para {@link
353android.app.IntentService#onHandleIntent onHandleIntent()}):</p>
354
355<pre>
356&#64;Override
357public int onStartCommand(Intent intent, int flags, int startId) {
358    Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
359    return super.onStartCommand(intent,flags,startId);
360}
361</pre>
362
363<p>Além de {@link android.app.IntentService#onHandleIntent onHandleIntent()}, o único método
364que não precisa ser usado para chamar a superclasse é {@link android.app.IntentService#onBind
365onBind()} (mas é necessário implementá-lo se o serviço permitir vinculações).</p>
366
367<p>Na próxima seção, você verá como o mesmo tipo de serviço é implementado ao estender
368a classe de base {@link android.app.Service}, que possui muito mais códigos, mas que pode
369ser apropriada para lidar com solicitações de inicialização simultâneas.</p>
370
371
372<h3 id="ExtendingService">Extensão da classe Service</h3>
373
374<p>Como você viu na seção anterior, o uso de {@link android.app.IntentService}
375torna a implementação de um serviço iniciado muito simples. Se, no entanto, você precisa do serviço
376para realizar vários encadeamentos (em vez de processar as solicitações de inicialização por meio de uma fila de trabalho),
377é possível estender a classe {@link android.app.Service} para lidar com cada intenção.</p>
378
379<p>Para efeito de comparação, o seguinte exemplo de código é uma implementação da classe {@link
380android.app.Service} que realiza exatamente o mesmo trabalho que o exemplo acima usando {@link
381android.app.IntentService}. Ou seja, para cada solicitação de inicialização, ela usa um encadeamento
382de trabalho para realizar o trabalho e processa apenas uma solicitação por vez.</p>
383
384<pre>
385public class HelloService extends Service {
386  private Looper mServiceLooper;
387  private ServiceHandler mServiceHandler;
388
389  // Handler that receives messages from the thread
390  private final class ServiceHandler extends Handler {
391      public ServiceHandler(Looper looper) {
392          super(looper);
393      }
394      &#64;Override
395      public void handleMessage(Message msg) {
396          // Normally we would do some work here, like download a file.
397          // For our sample, we just sleep for 5 seconds.
398          long endTime = System.currentTimeMillis() + 5*1000;
399          while (System.currentTimeMillis() &lt; endTime) {
400              synchronized (this) {
401                  try {
402                      wait(endTime - System.currentTimeMillis());
403                  } catch (Exception e) {
404                  }
405              }
406          }
407          // Stop the service using the startId, so that we don't stop
408          // the service in the middle of handling another job
409          stopSelf(msg.arg1);
410      }
411  }
412
413  &#64;Override
414  public void onCreate() {
415    // Start up the thread running the service.  Note that we create a
416    // separate thread because the service normally runs in the process's
417    // main thread, which we don't want to block.  We also make it
418    // background priority so CPU-intensive work will not disrupt our UI.
419    HandlerThread thread = new HandlerThread("ServiceStartArguments",
420            Process.THREAD_PRIORITY_BACKGROUND);
421    thread.start();
422
423    // Get the HandlerThread's Looper and use it for our Handler
424    mServiceLooper = thread.getLooper();
425    mServiceHandler = new ServiceHandler(mServiceLooper);
426  }
427
428  &#64;Override
429  public int onStartCommand(Intent intent, int flags, int startId) {
430      Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
431
432      // For each start request, send a message to start a job and deliver the
433      // start ID so we know which request we're stopping when we finish the job
434      Message msg = mServiceHandler.obtainMessage();
435      msg.arg1 = startId;
436      mServiceHandler.sendMessage(msg);
437
438      // If we get killed, after returning from here, restart
439      return START_STICKY;
440  }
441
442  &#64;Override
443  public IBinder onBind(Intent intent) {
444      // We don't provide binding, so return null
445      return null;
446  }
447
448  &#64;Override
449  public void onDestroy() {
450    Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
451  }
452}
453</pre>
454
455<p>Como pode ver, é muito mais trabalhoso do que usar {@link android.app.IntentService}.</p>
456
457<p>No entanto, como você lida com cada chamada de {@link android.app.Service#onStartCommand
458onStartCommand()}, é possível realizar várias solicitações simultaneamente. Isso não é o que este exemplo faz,
459mas, se for o que quer, é possível criar um novo encadeamento
460para cada solicitação e executá-las na hora (em vez de esperar que a solicitação anterior seja concluída).</p>
461
462<p>Observe que o método {@link android.app.Service#onStartCommand onStartCommand()} deve retornar
463um número inteiro. O número inteiro é um valor que descreve como o sistema deve continuar o serviço
464no evento em que o sistema o eliminar (como discutido acima, a implementação padrão de {@link
465android.app.IntentService} lida com isto, apesar de ser possível modificá-lo). O valor de retorno
466de {@link android.app.Service#onStartCommand onStartCommand()} deve ser uma das seguintes
467constantes:</p>
468
469<dl>
470  <dt>{@link android.app.Service#START_NOT_STICKY}</dt>
471    <dd>Se o sistema eliminar o serviço após o retorno de {@link android.app.Service#onStartCommand
472onStartCommand()}, <em>não</em> recrie o serviço, a não ser que tenha
473intenções pendentes para entregar. Esta é a opção mais segura para evitar executar o serviço quando desnecessário
474e quando o aplicativo puder simplesmente reiniciar qualquer trabalho incompleto.</dd>
475  <dt>{@link android.app.Service#START_STICKY}</dt>
476    <dd>Se o sistema eliminar o serviço após o retorno de {@link android.app.Service#onStartCommand
477onStartCommand()}, recrie o serviço e chame {@link
478android.app.Service#onStartCommand onStartCommand()}, mas <em>não</em> entregue novamente a última intenção.
479Em vez disso, o sistema chama {@link android.app.Service#onStartCommand onStartCommand()} com intenção nula,
480a não ser que tenha intenções pendentes para iniciar o serviço e,
481nesse caso, essas intenções são entregues. Isto é adequado para reprodutores de mídia (ou serviços semelhantes)
482que não estejam executando comandos, mas estejam em execução indefinidamente e aguardando um trabalho.</dd>
483  <dt>{@link android.app.Service#START_REDELIVER_INTENT}</dt>
484    <dd>Se o sistema eliminar o serviço após o retorno de {@link android.app.Service#onStartCommand
485onStartCommand()}, recrie o serviço e chame {@link
486android.app.Service#onStartCommand onStartCommand()} com a última intenção que foi entregue
487ao serviço. Quaisquer intenções pendentes são entregues, por sua vez. Isto é adequado para serviços que estejam realizando
488um trabalho ativamente que deva ser retomado imediatamente, como o download de um arquivo.</dd>
489</dl>
490<p>Para obter mais informações sobre esses valores de retorno, veja a documentação de referência vinculada
491a cada constante.</p>
492
493
494
495<h3 id="StartingAService">Início de um serviço</h3>
496
497<p>É possível iniciar um dispositivo de uma atividade ou outro componente do aplicativo passando uma
498{@link android.content.Intent} a {@link
499android.content.Context#startService startService()}. O sistema Android chama o método {@link
500android.app.Service#onStartCommand onStartCommand()} do serviço e passa a ele a {@link
501android.content.Intent} (nunca deve-se chamar {@link android.app.Service#onStartCommand
502onStartCommand()} diretamente).</p>
503
504<p>Por exemplo, uma atividade pode iniciar o serviço de exemplo na seção anterior ({@code
505HelloSevice}) usando uma intenção explícita com {@link android.content.Context#startService
506startService()}:</p>
507
508<pre>
509Intent intent = new Intent(this, HelloService.class);
510startService(intent);
511</pre>
512
513<p>O método {@link android.content.Context#startService startService()} retorna imediatamente
514e o sistema Android chama o método {@link android.app.Service#onStartCommand
515onStartCommand()} do serviço. Se o serviço não estiver em execução, o sistemo primeiro chama {@link
516android.app.Service#onCreate onCreate()} e, em seguida, chama {@link android.app.Service#onStartCommand
517onStartCommand()}.</p>
518
519<p>Se o serviço não fornecer vinculação, a intenção entregue com {@link
520android.content.Context#startService startService()} é o único modo de comunicação entre
521o componente do aplicativo e o serviço. No entanto, se quiser que o serviço envie um resultado de volta,
522o cliente que iniciar o serviço poderá criar um {@link android.app.PendingIntent} para uma transmissão
523(com {@link android.app.PendingIntent#getBroadcast getBroadcast()}) e entregá-la ao serviço
524na {@link android.content.Intent} que iniciar o serviço. O serviço pode então
525usar a transmissão para entregar um resultado.</p>
526
527<p>Várias solicitações para iniciar o serviço resultam em diversas chamadas correspondentes
528ao {@link android.app.Service#onStartCommand onStartCommand()} do serviço. No entanto, somente uma solicitação para interromper
529o serviço (com {@link android.app.Service#stopSelf stopSelf()} ou {@link
530android.content.Context#stopService stopService()}) é necessária para interrompê-lo.</p>
531
532
533<h3 id="Stopping">Interrupção de um serviço</h3>
534
535<p>Um serviço iniciado deve gerenciar seu próprio ciclo de vida. Ou seja, o sistema não interrompe
536ou elimina o serviço, a não ser que tenha que recuperar a memória do sistema e o serviço
537continuar em execução depois que {@link android.app.Service#onStartCommand onStartCommand()} retornar. Portanto,
538o serviço deve ser interrompido chamando {@link android.app.Service#stopSelf stopSelf()} ou outro
539componente pode interrompê-lo chamando {@link android.content.Context#stopService stopService()}.</p>
540
541<p>Ao solicitar o interrompimento com {@link android.app.Service#stopSelf stopSelf()} ou {@link
542android.content.Context#stopService stopService()}, o sistema elimina o serviço
543assim que possível.</p>
544
545<p>No entanto, se o serviço lida com várias solicitações para {@link
546android.app.Service#onStartCommand onStartCommand()} ao mesmo tempo, não se deve interromper
547o serviço ao terminar o processamento de uma solicitação de inicialização, pois é possível
548que uma nova solicitação de inicialização tenha ocorrido (interromper no final da primeira solicitação eliminaria a segunda). Para evitar este problema,
549é possível usar {@link android.app.Service#stopSelf(int)} para garantir que a solicitação
550que interrompe o serviço sempre se baseie na solicitação de inicialização mais recente. Ou seja, ao chamar {@link
551android.app.Service#stopSelf(int)}, você passa o ID da solicitação de inicialização (o <code>startId</code>
552entregue a {@link android.app.Service#onStartCommand onStartCommand()}) para aquele que solicitação de interrompimento
553corresponde. Em seguida, se o serviço receber uma nova solicitação de inicialização antes de ser possível chamar {@link
554android.app.Service#stopSelf(int)}, o ID não corresponderá e o serviço não será interrompido.</p>
555
556<p class="caution"><strong>Atenção:</strong> é importante que um aplicativo interrompa seus serviços
557quando terminar os trabalhos para evitar o desperdício dos recursos do sistema e consumo da bateria. Se necessário,
558outros componentes podem interromper o serviço chamando {@link
559android.content.Context#stopService stopService()}. Mesmo se for possível vincular-se ao serviço,
560deve-se sempre interrompê-lo por conta própria se ele tiver recebido uma chamada de {@link
561android.app.Service#onStartCommand onStartCommand()}.</p>
562
563<p>Para obter mais informações sobre o ciclo de vida de um serviço, consulte a seção <a href="#Lifecycle">Gerenciamento do ciclo de vida de um serviço</a> abaixo.</p>
564
565
566
567<h2 id="CreatingBoundService">Criação de um serviço vinculado</h2>
568
569<p>Um serviço vinculado permite que componentes de aplicativo sejam vinculados chamando {@link
570android.content.Context#bindService bindService()} para criar uma conexão de longo prazo
571(e, geralmente, não permite que os componentes o <em>iniciem</em> chamando {@link
572android.content.Context#startService startService()}).</p>
573
574<p>Deve-se criar um serviço vinculado quando se deseja interagir com o serviço a partir de atividades
575e outros componentes no aplicativo ou para expor algumas das funcionalidades do aplicativo
576para outros aplicativos, por meio de comunicação entre processos (IPC).</p>
577
578<p>Para criar um serviço vinculado, você deve implementar o método de retorno de chamada {@link
579android.app.Service#onBind onBind()} para retornar um {@link android.os.IBinder}
580que define a interface para a comunicação com o serviço. Outros componentes de aplicativo podem chamar
581{@link android.content.Context#bindService bindService()} para recuperar a interface
582e começar a chamar métodos no serviço. O serviço vive somente para servir o componente do aplicativo
583ao qual ele está vinculado. Portanto, quando não houver componentes vinculados ao serviço, o sistema o eliminará
584(<em>não</em> é necessário interromper um serviço vinculado da mesma maneira que quando o serviço é iniciado
585por meio de {@link android.app.Service#onStartCommand onStartCommand()}).</p>
586
587<p>Para criar um serviço vinculado, a primeira coisa a se fazer é definir a interface que especifica
588como um cliente pode comunicar-se com o servidor. Esta interface entre o serviço
589e um cliente deve ser uma implementação de {@link android.os.IBinder} e é o que o serviço deve retornar
590a partir do método de retorno de chamada {@link android.app.Service#onBind
591onBind()}. Quando o cliente receber {@link android.os.IBinder}, ele poderá começar
592a interagir com o serviço por meio da interface.</p>
593
594<p>Vários clientes podem vincular-se ao serviço por vez. Quando um cliente terminar de interagir com o serviço,
595 ele chamará {@link android.content.Context#unbindService unbindService()} para desvincular-se. Quando não houver
596clientes vinculados ao serviço, o sistema o eliminará.</p>
597
598<p>Há várias maneiras de implementar um serviço vinculado e a implementação é mais complicada
599que um serviço iniciado. Logo, a discussão sobre serviços vinculados aparece em um documento separado
600sobre <a href="{@docRoot}guide/components/bound-services.html">Serviços vinculados</a>.</p>
601
602
603
604<h2 id="Notifications">Enviar notificações ao usuário</h2>
605
606<p>Quando em execução, um serviço pode notificar o usuário sobre eventos usando <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Notificações de aviso</a> ou <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notificações da barra de status</a>.</p>
607
608<p>Uma notificação de aviso é uma mensagem que aparece na superfície da janela atual
609por um breve momento antes de desaparecer, enquanto que uma notificação da barra de status fornece um ícone na barra de status
610com uma mensagem que o usuário pode selecionar para realizar uma ação (como iniciar uma atividade).</p>
611
612<p>Geralmente, uma notificação da barra de status é a melhor técnica quando um trabalho de segundo plano é concluído
613(como download
614de arquivo completo) e o usuário pode agir a partir dele. Quando o usuário seleciona a notificação a partir
615da vista expandida, ela pode iniciar uma atividade (como a vista do arquivo baixado).</p>
616
617<p>Consulte os guias de desenvolvedor <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Notificações de aviso</a> ou <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notificações da barra de status</a>
618para obter mais informações.</p>
619
620
621
622<h2 id="Foreground">Execução de serviço em primeiro plano</h2>
623
624<p>Um serviço de primeiro plano é aquele
625com que o usuário está ativamente interagindo e não é uma opção para o sistema eliminá-lo quando a memória estiver baixa. Um serviço de primeiro plano
626deve fornecer uma notificação para a barra de status, que é colocada sob
627"o cabeçalho "Em andamento", o que significa que a notificação não pode ser dispensada a não ser que o serviço
628seja interrompido ou removido do primeiro plano.</p>
629
630<p>Por exemplo, um reprodutor de música que reproduz a partir de um serviço deve ser configurado
631para permanecer em execução em primeiro plano, pois o usuário está
632prestando atenção em sua operação explicitamente. A notificação na barra de status pode indicar a música atual
633e permitir que o usuário inicie uma atividade para interagir com o reprodutor de música.</p>
634
635<p>Para solicitar que o serviço seja executado em primeiro plano, chame {@link
636android.app.Service#startForeground startForeground()}. Este método usa dois parâmetros: um número inteiro
637que identifica unicamente a notificação e {@link
638android.app.Notification} para a barra de status. Por exemplo:</p>
639
640<pre>
641Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
642        System.currentTimeMillis());
643Intent notificationIntent = new Intent(this, ExampleActivity.class);
644PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
645notification.setLatestEventInfo(this, getText(R.string.notification_title),
646        getText(R.string.notification_message), pendingIntent);
647startForeground(ONGOING_NOTIFICATION_ID, notification);
648</pre>
649
650<p class="caution"><strong>Atenção:</strong> O ID do número inteiro fornecido para {@link
651android.app.Service#startForeground startForeground()} não deve ser zero.</p>
652
653
654<p>Para remover o serviço do primeiro plano, chame {@link
655android.app.Service#stopForeground stopForeground()}. Este método usa um booleano,
656indicando se deve remover também a notificação da barra de status. Este método <em>não</em> interrompe
657o serviço. No entanto, se você interromper o serviço enquanto estiver em execução em primeiro plano,
658a notificação também será removida.</p>
659
660<p>Para obter mais informações sobre notificações, consulte <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Criação de notificações
661da barra de status</a>.</p>
662
663
664
665<h2 id="Lifecycle">Gerenciamento do ciclo de vida de um serviço</h2>
666
667<p>O ciclo de vida de um serviço é muito mais simples do que o de uma atividade. No entanto, é ainda mais importante
668que você preste muita atenção em como o serviço é criado e eliminado, pois ele
669pode ser executado em primeiro plano sem que o usuário esteja ciente.</p>
670
671<p>O ciclo de vida do serviço &mdash; desde quando é criado até ser eliminado &mdash; pode seguir
672dois caminhos:</p>
673
674<ul>
675<li>Um serviço iniciado
676  <p>O serviço é criado quando outro componente chama {@link
677android.content.Context#startService startService()}. Depois, o serviço permanece em execução indefinidamente e deve
678interromper-se chamando {@link
679android.app.Service#stopSelf() stopSelf()}. Outro componente também pode interromper
680o serviço chamando {@link
681android.content.Context#stopService stopService()}. Quando o serviço é interrompido, o sistema o elimina.</p></li>
682
683<li>Um serviço vinculado
684  <p>O serviço é criado quando outro componente (um cliente) chama {@link
685android.content.Context#bindService bindService()}. O cliente comunica-se com o serviço
686pela interface {@link android.os.IBinder}. O cliente pode escolher encerrar a conexão chamando
687{@link android.content.Context#unbindService unbindService()}. Vários clientes podem ser vinculados
688ao mesmo serviço e, quando todos os vínculos terminam, o sistema destrói o serviço (o serviço
689<em>não</em> precisa ser interrompido).</p></li>
690</ul>
691
692<p>Esses dois caminhos não são inteiramente separados. Ou seja, é possível vincular um serviço
693que já foi iniciado com {@link android.content.Context#startService startService()}. Por exemplo, um serviço de música
694de segundo plano pode ser iniciado chamando {@link android.content.Context#startService
695startService()} com uma {@link android.content.Intent} que identifica a música reproduzida. Depois,
696possivelmente quando o usuário quiser exercer mais controle sobre o reprodutor ou obter informações
697sobre a música em reprodução, uma atividade pode ser vinculada ao serviço chamando {@link
698android.content.Context#bindService bindService()}. Em casos como esse, {@link
699android.content.Context#stopService stopService()} ou {@link android.app.Service#stopSelf
700stopSelf()} não interrompe o serviço até que todos os clientes sejam desvinculados. </p>
701
702
703<h3 id="LifecycleCallbacks">Implementação de retornos de chamada do ciclo de vida</h3>
704
705<p>Como uma atividade, um serviço tem um método de ciclo de vida que é possível implementar
706para monitorar as alterações no estado do serviço e realizar trabalhos em momentos adequados. O seguinte serviço de esqueleto
707demonstra cada um dos métodos de ciclo de vida:</p>
708
709<pre>
710public class ExampleService extends Service {
711    int mStartMode;       // indicates how to behave if the service is killed
712    IBinder mBinder;      // interface for clients that bind
713    boolean mAllowRebind; // indicates whether onRebind should be used
714
715    &#64;Override
716    public void {@link android.app.Service#onCreate onCreate}() {
717        // The service is being created
718    }
719    &#64;Override
720    public int {@link android.app.Service#onStartCommand onStartCommand}(Intent intent, int flags, int startId) {
721        // The service is starting, due to a call to {@link android.content.Context#startService startService()}
722        return <em>mStartMode</em>;
723    }
724    &#64;Override
725    public IBinder {@link android.app.Service#onBind onBind}(Intent intent) {
726        // A client is binding to the service with {@link android.content.Context#bindService bindService()}
727        return <em>mBinder</em>;
728    }
729    &#64;Override
730    public boolean {@link android.app.Service#onUnbind onUnbind}(Intent intent) {
731        // All clients have unbound with {@link android.content.Context#unbindService unbindService()}
732        return <em>mAllowRebind</em>;
733    }
734    &#64;Override
735    public void {@link android.app.Service#onRebind onRebind}(Intent intent) {
736        // A client is binding to the service with {@link android.content.Context#bindService bindService()},
737        // after onUnbind() has already been called
738    }
739    &#64;Override
740    public void {@link android.app.Service#onDestroy onDestroy}() {
741        // The service is no longer used and is being destroyed
742    }
743}
744</pre>
745
746<p class="note"><strong>Observação:</strong> diferentemente dos métodos de retorno de chamada do ciclo de vida da atividade,
747você <em>não</em> precisa chamar a implementação da superclasse.</p>
748
749<img src="{@docRoot}images/service_lifecycle.png" alt="" />
750<p class="img-caption"><strong>Figura 2.</strong> Ciclo de vida do serviço. O diagrama à esquerda
751mostra o ciclo de vida quando o serviço é criado com {@link android.content.Context#startService
752startService()} e o diagrama à direita mostra o ciclo de vida quando o serviço
753é criado com {@link android.content.Context#bindService bindService()}.</p>
754
755<p>Ao implementar esses métodos, é possível monitorar dois retornos (loops) aninhados no ciclo de vida do serviço: </p>
756
757<ul>
758<li><strong>Todo o ciclo de vida</strong> de um serviço acontece entre o momento em que {@link
759android.app.Service#onCreate onCreate()} é chamado e em que {@link
760android.app.Service#onDestroy} retorna. Como uma atividade, um serviço faz a sua configuração inicial
761em {@link android.app.Service#onCreate onCreate()} e libera todos os recursos restantes em {@link
762android.app.Service#onDestroy onDestroy()}.  Por exemplo,
763um serviço de reprodução de música pode criar um encadeamento onde a música será reproduzida em {@link
764android.app.Service#onCreate onCreate()}, e interromperá o encadeamento em {@link
765android.app.Service#onDestroy onDestroy()}.
766
767<p>Os métodos {@link android.app.Service#onCreate onCreate()} e {@link android.app.Service#onDestroy
768onDestroy()} são chamados para todos os serviços,
769se tiverem sido criados por {@link android.content.Context#startService startService()} ou {@link
770android.content.Context#bindService bindService()}.</p></li>
771
772<li>O <strong>ciclo de vida ativo</strong> de um serviço começa com uma chamada de {@link
773android.app.Service#onStartCommand onStartCommand()} ou {@link android.app.Service#onBind onBind()}.
774Cada método entrega a {@link
775android.content.Intent} que foi passada para {@link android.content.Context#startService
776startService()} ou {@link android.content.Context#bindService bindService()}, respectivamente.
777<p>Se o serviço for iniciado, o ciclo de vida ativo terminará no mesmo momento
778em que o ciclo de vida inteiro terminar (o serviço permanece ativo mesmo após o retorno de {@link android.app.Service#onStartCommand
779onStartCommand()}). Se o serviço estiver vinculado, o ciclo de ida ativo acabará quando {@link
780android.app.Service#onUnbind onUnbind()} retornar.</p>
781</li>
782</ul>
783
784<p class="note"><strong>Observação:</strong> apesar de um serviço iniciado ser interrompido com uma chamada
785de {@link android.app.Service#stopSelf stopSelf()} ou {@link
786android.content.Context#stopService stopService()}, não há um retorno de chamada respectivo
787para o serviço (não há retorno de chamada de {@code onStop()}). Portanto, a não ser que o serviço esteja vinculado a um cliente,
788o sistema o eliminará quando for interrompido &mdash; {@link
789android.app.Service#onDestroy onDestroy()} será o único retorno de chamada recebido.</p>
790
791<p>A figura 2 ilustra os métodos de retorno de chamada tradicionais para um serviço. Apesar de a figura separar
792os serviços que são criados por {@link android.content.Context#startService startService()}
793daqueles que são criados por {@link android.content.Context#bindService bindService()},
794observe que qualquer serviço, não importa como foi iniciado, pode permitir a vinculação de clientes.
795Portanto, um serviço que já foi iniciado com {@link android.app.Service#onStartCommand
796onStartCommand()} (por um cliente chamando  {@link android.content.Context#startService startService()})
797ainda pode receber uma chamada de {@link android.app.Service#onBind onBind()} (quando um cliente chama
798{@link android.content.Context#bindService bindService()}).</p>
799
800<p>Para obter mais informações sobre como criar um serviço que forneça vinculação, consulte o documento <a href="{@docRoot}guide/components/bound-services.html">Serviços vinculados</a>,
801que aborda mais profundamente o método de retorno de chamada {@link android.app.Service#onRebind onRebind()}
802na seção sobre <a href="{@docRoot}guide/components/bound-services.html#Lifecycle">Gerenciamento do ciclo de vida
803de um serviço vinculado</a>.</p>
804
805
806<!--
807<h2>Beginner's Path</h2>
808
809<p>To learn how to query data from the system or other applications (such as contacts or media
810stored on the device), continue with the <b><a
811href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a></b>
812document.</p>
813-->
814