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 — 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 — 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 — 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 — 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 <service>}</a> 189como filho do elemento <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a> 190. Por exemplo:</p> 191 192<pre> 193<manifest ... > 194 ... 195 <application ... > 196 <service android:name=".ExampleService" /> 197 ... 198 </application> 199</manifest> 200</pre> 201 202<p>Consulte a referência de elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>}</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 <service>}</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 — 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 @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() < 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@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 @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() < 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 @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 @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 @Override 443 public IBinder onBind(Intent intent) { 444 // We don't provide binding, so return null 445 return null; 446 } 447 448 @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 — desde quando é criado até ser eliminado — 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 @Override 716 public void {@link android.app.Service#onCreate onCreate}() { 717 // The service is being created 718 } 719 @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 @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 @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 @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 @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 — {@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