1 page.title=Servios 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 bsicos</a></li> 9 <ol> 10 <li><a href="#Declaring">Declarao de servio no manifesto</a></li> 11 </ol> 12 <li><a href="#CreatingAService">Criao de servio iniciado</a> 13 <ol> 14 <li><a href="#ExtendingIntentService">Extenso da classe IntentService</a></li> 15 <li><a href="#ExtendingService">Extenso da classe Service</a></li> 16 <li><a href="#StartingAService">Incio de servio</a></li> 17 <li><a href="#Stopping">Interrupo de servio</a></li> 18 </ol> 19 </li> 20 <li><a href="#CreatingBoundService">Criao de servio vinculado</a></li> 21 <li><a href="#Notifications">Envio de notificaes ao usurio</a></li> 22 <li><a href="#Foreground">Execuo de servio em primeiro plano</a></li> 23 <li><a href="#Lifecycle">Gerenciamento do ciclo de vida de um servio</a> 24 <ol> 25 <li><a href="#LifecycleCallbacks">Implementao 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 tambm</h2> 45 <ol> 46 <li><a href="{@docRoot}guide/components/bound-services.html">Servios vinculados</a></li> 47 </ol> 48 49 </div> 50 51 52 <p>Um {@link android.app.Service} um componente do aplicativo que pode realizar 53 operaes longas e no fornece uma interface do usurio. Outro componente do aplicativo 54 pode iniciar um servio e ele continuar em execuo em segundo plano mesmo que o usurio 55 alterne para outro aplicativo. Alm disso, um componente poder vincular-se a um servio 56 para interagir com ele e at estabelecer comunicao entre processos (IPC). Por exemplo, um servio pode lidar 57 com operaes de rede, reproduzir msica, executar E/S de arquivos, ou interagir com um provedor de contedo, 58 tudo a partir do segundo plano.</p> 59 60 <p>Um servio pode essencialmente ter duas formas:</p> 61 62 <dl> 63 <dt>Iniciado</dt> 64 <dd>Um servio "iniciado" quando um componente do aplicativo (como um atividade) 65 inicia-o chamando {@link android.content.Context#startService startService()}. Quando iniciado, um servio 66 pode ficar em execuo em segundo plano indefinidamente, mesmo que o componente que o iniciou seja destrudo. Geralmente, 67 um servio iniciado realiza uma nica operao e no retorna um resultado para o autor da chamada. 68 Por exemplo, ele pode fazer download ou upload de um arquivo pela rede. Quando a operao for concluda, 69 o servio dever ser interrompido.</dd> 70 <dt>Vinculado</dt> 71 <dd>Um servio "vinculado" quando um componente do aplicativo o vincula chamando {@link 72 android.content.Context#bindService bindService()}. Um servio vinculado oferece uma interface 73 servidor-cliente que permite que os componentes interajam com a interface, enviem solicitaes, obtenham resultados, 74 mesmo em processos com comunicao interprocessual (IPC). Um servio vinculado permanece em execuo somente enquanto 75 outro componente do aplicativo estiver vinculado a ele. Vrios componentes podem ser vinculados ao servio de uma s vez, 76 mas quando todos desfizerem o vnculo, o servio ser destrudo.</dd> 77 </dl> 78 79 <p>Apesar de esta documentao discutir os dois tipos de servios separadamente, 80 um servio pode funcionar das duas maneiras — ele pode ser iniciado (para permanecer em execuo indefinidamente) e tambm permitir a vinculao. 81 Basta voc implementar alguns mtodos de retorno de chamada: {@link 82 android.app.Service#onStartCommand onStartCommand()} para permitir que os componentes iniciem o servio e {@link 83 android.app.Service#onBind onBind()} para permitir a vinculao.</p> 84 85 <p>Se o aplicativo for iniciado, vinculado ou ambos, qualquer componente do aplicativo 86 poder usar o servio (mesmo a partir de um aplicativo separado), da mesma forma que qualquer componente poder usar 87 uma atividade — iniciando com uma {@link android.content.Intent}. No entanto, possvel declarar 88 o servio como privado, no arquivo do manifesto, e bloquear o acesso de outros aplicativos. Isto discutido com mais detalhes 89 na seo <a href="#Declaring">Declarao do servio 90 no manifesto</a>.</p> 91 92 <p class="caution"><strong>Ateno:</strong> um servio executado 93 no encadeamento principal em seu processo de hospedagem — o servio <strong>no</strong> cria seu prprio encadeamento 94 e <strong>no</strong> executado em um processo separado (salvo se especificado). Isso significa que, 95 se o servio for realizar qualquer trabalho intensivo de CPU ou operaes de bloqueio (como reproduo 96 de MP3 ou rede), voc deve criar um novo encadeamento dentro do servio. Usando um encadeamento separado, 97 voc reduzir o risco da ocorrncia de erros de Aplicativo no respondendo (ANR) 98 e o encadeamento principal do aplicativo poder permanecer dedicado interao do usurio com as atividades.</p> 99 100 101 <h2 id="Basics">Conceitos bsicos</h2> 102 103 <div class="sidebox-wrapper"> 104 <div class="sidebox"> 105 <h3>Voc deve usar um servio ou um encadeamento?</h3> 106 <p>Um servio simplesmente um componente que pode ser executado em segundo plano mesmo quando o usurio 107 no est interagindo com o aplicativo. Portanto, um servio deve ser criado somente 108 se for realmente necessrio.</p> 109 <p>Caso precise realizar trabalhos fora do encadeamento principal, mas somente enquanto o usurio estiver interagindo 110 com o aplicativo, ento voc deve criar um novo encadeamento e no um servio. Por exemplo, 111 se quiser reproduzir msicas, mas somente enquanto a atividade estiver em execuo, voc pode criar um encadeamento 112 em {@link android.app.Activity#onCreate onCreate()}, iniciando a execuo em {@link 113 android.app.Activity#onStart onStart()}, e interrompendo em {@link android.app.Activity#onStop 114 onStop()}. Considere tambm usar {@link android.os.AsyncTask} ou {@link android.os.HandlerThread}, 115 em vez de a classe tradicional {@link java.lang.Thread}. Consulte o documento <a href="{@docRoot}guide/components/processes-and-threads.html#Threads">Processos e 116 encadeamentos</a> para obter mais informaes sobre encadeamentos.</p> 117 <p>Lembre-se de que, se usar um servio, ele ainda ser executado no encadeamento principal do aplicativo por padro, 118 portanto deve-se criar um novo encadeamento dentro do servio se ele realizar operaes 119 intensivas ou de bloqueio.</p> 120 </div> 121 </div> 122 123 <p>Para criar um servio, voc deve criar uma subclasse de {@link android.app.Service} 124 (ou uma das subclasses existentes). Na implementao, ser necessrio substituir alguns mtodos de retorno de chamada 125 que lidem com aspectos essenciais do ciclo de vida do servio e forneam um mecanismo para vincular 126 componentes ao servio, se apropriado. Os dois mtodos mais importantes de retorno de chamada que voc deve substituir so:</p> 127 128 <dl> 129 <dt>{@link android.app.Service#onStartCommand onStartCommand()}</dt> 130 <dd>O sistema chama este mtodo quando outro componente, como uma atividade, 131 solicita que o servio seja iniciado, chamando {@link android.content.Context#startService 132 startService()}. Quando este mtodo executado, o servio iniciado e pode ser executado 133 em segundo plano indefinidamente. Se implementar isto, de sua responsabilidade interromper o servio 134 quando o trabalho for concludo, chamando {@link android.app.Service#stopSelf stopSelf()} ou {@link 135 android.content.Context#stopService stopService()} (caso queira somente fornecer a vinculao, 136 no necessrio implementar este mtodo).</dd> 137 <dt>{@link android.app.Service#onBind onBind()}</dt> 138 <dd>O sistema chama este mtodo quando outro componente quer vincular-se 139 ao servio (como para realizaes de RPC) chamando {@link android.content.Context#bindService 140 bindService()}. Na implementao deste mtodo, voc deve fornecer uma interface que os clientes 141 usem para comunicar-se com o servio, retornando um {@link android.os.IBinder}. Voc sempre deve implementar este mtodo, 142 mas, se no quiser permitir a vinculao, retorne nulo.</dd> 143 <dt>{@link android.app.Service#onCreate()}</dt> 144 <dd>O sistema chama este mtodo quando o servio criado pela primeira vez para realizar procedimentos nicos 145 de configurao (antes de chamar {@link android.app.Service#onStartCommand onStartCommand()} ou 146 {@link android.app.Service#onBind onBind()}). Se o servio j estiver em execuo, este mtodo 147 no chamado.</dd> 148 <dt>{@link android.app.Service#onDestroy()}</dt> 149 <dd>O sistema chama este mtodo quando o servio no mais usado e est sendo destrudo. 150 O servio deve implementar isto para limpar quaisquer recursos, como encadeamentos, escutas 151 registradas, receptores etc. Esta a ltima chamada que o servio recebe.</dd> 152 </dl> 153 154 <p>Se um componente iniciar o servio chamando {@link 155 android.content.Context#startService startService()} (o que resulta em uma chamada para {@link 156 android.app.Service#onStartCommand onStartCommand()}), 157 o servio permanecer em execuo at ser interrompido por conta prpria com {@link android.app.Service#stopSelf()} ou por outro componente 158 chamando {@link android.content.Context#stopService stopService()}.</p> 159 160 <p>Se um componente 161 chamar {@link android.content.Context#bindService bindService()} para criar o servio (e {@link 162 android.app.Service#onStartCommand onStartCommand()} <em>no</em> for chamado), o servio ser executado 163 somente enquanto o componente estiver vinculado a ele. Quando o servio for desvinculado de todos os clientes, 164 o sistema o destruir.</p> 165 166 <p>O sistema Android forar a interrupo de um servio somente quando a memria estiver baixa e precisar 167 recuperar os recursos do sistema para a atividade com que o usurio estiver interagindo. Se o servio estiver vinculado a uma atividade que o usurio 168 tenha atribudo foco, menos provvel que ele seja eliminado. E, se o servio for declarado para <a href="#Foreground">ser executado em primeiro plano</a> (discutido posteriormente), ento ele quase nunca ser eliminado. 169 Caso contrrio, se o servio for iniciado e estiver em uma longa execuo, o sistema reduzir sua posio 170 na lista de tarefas de segundo plano no decorrer do tempo e o servio se tornar altamente suscetvel 171 eliminao — se o servio for iniciado, ento voc deve program-lo para lidar 172 com reinicializaes pelo sistema. Se o sistema eliminar o seu servio, ele reiniciar assim que os recursos 173 estiverem disponveis novamente (apesar de isto tambm depender do valor que voc retornar de {@link 174 android.app.Service#onStartCommand onStartCommand()}, como discutido a seguir). Para obter mais informaes sobre 175 quando o sistema deve destruir um servio, consulte o documento <a href="{@docRoot}guide/components/processes-and-threads.html">Processos e encadeamentos</a> 176 .</p> 177 178 <p>Nas seguintes sees, voc ver como possvel criar cada tipo de servio e como 179 us-los a partir de outros componentes do aplicativo.</p> 180 181 182 183 <h3 id="Declaring">Declarao de servio no manifesto</h3> 184 185 <p>Como atividades (e outros componentes), voc deve declarar todos os servios no arquivo de manifesto 186 do aplicativo.</p> 187 188 <p>Para declarar o servio, adicione um elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>}</a> 189 como 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 referncia de elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>}</a> 203 para obter mais informaes sobre como declarar o servio no manifesto.</p> 204 205 <p> possvel incluir outros atributos no elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code <service>}</a> 206 para definir propriedades como permisses necessrias para iniciar o servio e o processo 207 em que o servio deve ser executado. O atributo <a href="{@docRoot}guide/topics/manifest/service-element.html#nm">{@code android:name}</a> 208 o nico necessrio — ele especifica o nome da classe do servio. Ao publicar o aplicativo, 209 no deve-se alterar-lhe o nome porque, se isso acontecer, h riscos de ocorrncia de erros 210 de cdigo devido dependncia de intenes explcitas para iniciar ou vincular o servio (leia a publicao do blogue, <a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Coisas 211 que no podem mudar</a>). 212 213 <p>Para garantir a segurana do aplicativo, <strong>sempre use uma inteno explcita ao iniciar ou vincular 214 {@link android.app.Service}</strong> e no declare filtros de inteno para o servio. Caso seja essencial permitir alguma ambiguidade, como qual servio deve ser usado para iniciar, 215 possvel fornecer filtros de intenes 216 para os servios e excluir o nome do componente de {@link 217 android.content.Intent}, mas preciso definir o pacote para a inteno com {@link 218 android.content.Intent#setPackage setPackage()}, que fornece desambiguidade suficiente para 219 o servio alvo.</p> 220 221 <p>Alm disso, possvel garantir que o servio esteja disponvel somente para o aplicativo 222 incluindo o atributo <a href="{@docRoot}guide/topics/manifest/service-element.html#exported">{@code android:exported}</a> 223 e definindo-o como {@code "false"}. Isto impede efetivamente que outros aplicativos iniciem o servio, 224 mesmo usando uma inteno explcita.</p> 225 226 227 228 229 <h2 id="CreatingStartedService">Criao de um servio iniciado</h2> 230 231 <p>Um servio iniciado o que outro componente inicia chamando {@link 232 android.content.Context#startService startService()}, resultando em uma chamada para o mtodo 233 {@link android.app.Service#onStartCommand onStartCommand()} do servio.</p> 234 235 <p>Quando um servio iniciado, ele tem um ciclo de vida que no depende do componente 236 que o iniciou. Alm disso, o servio pode ser executado em segundo plano indefinidamente, 237 mesmo se o componente que o iniciou for eliminado. Alm disso, o servio deve ser interrompido quando o seu trabalho 238 for realizado, chamando {@link android.app.Service#stopSelf stopSelf()}. Outros componentes podem interromp-lo 239 chamando {@link android.content.Context#stopService stopService()}.</p> 240 241 <p>Um componente do aplicativo, como uma atividade, pode iniciar o servio chamando {@link 242 android.content.Context#startService startService()} e passando {@link android.content.Intent}, 243 que especifica o servio e inclui os dados para o servio usar. O servio 244 recebe esta {@link android.content.Intent} no mtodo {@link android.app.Service#onStartCommand 245 onStartCommand()}.</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 248 um servio de acompanhamento e entregar a ele os dados a salvar passando uma inteno para {@link 249 android.content.Context#startService startService()}. O servio recebe a inteno em {@link 250 android.app.Service#onStartCommand onStartCommand()}, conecta-se Internet e realiza 251 a transao no banco de dados. Quando a operao concluda, o servio interrompido 252 e destrudo.</p> 253 254 <p class="caution"><strong>Ateno:</strong> um servio executado no mesmo processo que o aplicativo 255 em que ele declarado e no encadeamento principal do aplicativo, por padro. Portanto, se o servio 256 realizar operaes intensivas ou de bloqueio quando o usurio interagir com uma atividade do mesmo aplicativo, 257 diminuir o desempenho da atividade. Para evitar impacto no desempenho do aplicativo, 258 deve-se iniciar um novo encadeamento dentro do servio.</p> 259 260 <p>Geralmente, h duas classes que podem ser estendidas para criar um servio iniciado:</p> 261 <dl> 262 <dt>{@link android.app.Service}</dt> 263 <dd>Esta a classe de base para todos os servios. Ao estender esta classe, importante 264 criar um novo encadeamento para fazer todo o trabalho do servio, pois o servio usa 265 o encadeamento principal do aplicativo, por padro, o que deve diminuir o desempenho de qualquer atividade 266 que 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 269 com todas as solicitaes de inicializao, uma por vez. Esta a melhor opo se no quiser que o servio 270 lide com vrias solicitaes simultaneamente. Tudo que precisa fazer implementar {@link 271 android.app.IntentService#onHandleIntent onHandleIntent()}, que recebe a inteno para cada solicitao 272 de incio para que voc possa realizar o trabalho de segundo plano.</dd> 273 </dl> 274 275 <p>As seguintes sees descrevem como possvel implementar o servio usando 276 uma dessas classes.</p> 277 278 279 <h3 id="ExtendingIntentService">Extenso da classe IntentService</h3> 280 281 <p>Como a maioria dos servios no precisam lidar com vrias solicitaes simultaneamente 282 (o que pode ser perigoso para situaes de vrios encadeamentos), melhor 283 se o servio 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 padro que executa todas as intenes entregues a {@link 289 android.app.Service#onStartCommand onStartCommand()} separado do encadeamento principal 290 do aplicativo.</li> 291 <li>Cria uma fila de trabalho que passa uma inteno por vez implementao {@link 292 android.app.IntentService#onHandleIntent onHandleIntent()}, para que nunca seja necessrio 293 preocupar-se com vrios encadeamentos.</li> 294 <li>Interrompe o servio depois que todas as solicitaes forem resolvidas para que no seja necessrio chamar 295 {@link android.app.Service#stopSelf}.</li> 296 <li>Fornece implementaes padro de {@link android.app.IntentService#onBind onBind()} 297 que retornam como nulo.</li> 298 <li>Fornece uma implementao padro de {@link android.app.IntentService#onStartCommand 299 onStartCommand()} que envia a inteno para a fila de trabalho e, em seguida, para a implementao de {@link 300 android.app.IntentService#onHandleIntent onHandleIntent()}.</li> 301 </ul> 302 303 <p>Tudo isso adiciona-se ao fato de que basta implementar {@link 304 android.app.IntentService#onHandleIntent onHandleIntent()} para fazer o trabalho fornecido 305 pelo cliente (embora tambm seja necessrio fornecer um pequeno construtor para o servio).</p> 306 307 <p>A seguir h um exemplo de implementao de {@link android.app.IntentService}:</p> 308 309 <pre> 310 public 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 implementao de {@link 343 android.app.IntentService#onHandleIntent onHandleIntent()}.</p> 344 345 <p>Caso decida substituir outros mtodos de retorno de chamada, como {@link 346 android.app.IntentService#onCreate onCreate()}, {@link 347 android.app.IntentService#onStartCommand onStartCommand()} ou {@link 348 android.app.IntentService#onDestroy onDestroy()}, certifique-se de chamar a super-implementao 349 para 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 352 a implementao padro (que como a inteno entregue para {@link 353 android.app.IntentService#onHandleIntent onHandleIntent()}):</p> 354 355 <pre> 356 @Override 357 public 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>Alm de {@link android.app.IntentService#onHandleIntent onHandleIntent()}, o nico mtodo 364 que no precisa ser usado para chamar a superclasse {@link android.app.IntentService#onBind 365 onBind()} (mas necessrio implement-lo se o servio permitir vinculaes).</p> 366 367 <p>Na prxima seo, voc ver como o mesmo tipo de servio implementado ao estender 368 a classe de base {@link android.app.Service}, que possui muito mais cdigos, mas que pode 369 ser apropriada para lidar com solicitaes de inicializao simultneas.</p> 370 371 372 <h3 id="ExtendingService">Extenso da classe Service</h3> 373 374 <p>Como voc viu na seo anterior, o uso de {@link android.app.IntentService} 375 torna a implementao de um servio iniciado muito simples. Se, no entanto, voc precisa do servio 376 para realizar vrios encadeamentos (em vez de processar as solicitaes de inicializao por meio de uma fila de trabalho), 377 possvel estender a classe {@link android.app.Service} para lidar com cada inteno.</p> 378 379 <p>Para efeito de comparao, o seguinte exemplo de cdigo uma implementao da classe {@link 380 android.app.Service} que realiza exatamente o mesmo trabalho que o exemplo acima usando {@link 381 android.app.IntentService}. Ou seja, para cada solicitao de inicializao, ela usa um encadeamento 382 de trabalho para realizar o trabalho e processa apenas uma solicitao por vez.</p> 383 384 <pre> 385 public 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 458 onStartCommand()}, possvel realizar vrias solicitaes simultaneamente. Isso no o que este exemplo faz, 459 mas, se for o que quer, possvel criar um novo encadeamento 460 para cada solicitao e execut-las na hora (em vez de esperar que a solicitao anterior seja concluda).</p> 461 462 <p>Observe que o mtodo {@link android.app.Service#onStartCommand onStartCommand()} deve retornar 463 um nmero inteiro. O nmero inteiro um valor que descreve como o sistema deve continuar o servio 464 no evento em que o sistema o eliminar (como discutido acima, a implementao padro de {@link 465 android.app.IntentService} lida com isto, apesar de ser possvel modific-lo). O valor de retorno 466 de {@link android.app.Service#onStartCommand onStartCommand()} deve ser uma das seguintes 467 constantes:</p> 468 469 <dl> 470 <dt>{@link android.app.Service#START_NOT_STICKY}</dt> 471 <dd>Se o sistema eliminar o servio aps o retorno de {@link android.app.Service#onStartCommand 472 onStartCommand()}, <em>no</em> recrie o servio, a no ser que tenha 473 intenes pendentes para entregar. Esta a opo mais segura para evitar executar o servio quando desnecessrio 474 e 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 servio aps o retorno de {@link android.app.Service#onStartCommand 477 onStartCommand()}, recrie o servio e chame {@link 478 android.app.Service#onStartCommand onStartCommand()}, mas <em>no</em> entregue novamente a ltima inteno. 479 Em vez disso, o sistema chama {@link android.app.Service#onStartCommand onStartCommand()} com inteno nula, 480 a no ser que tenha intenes pendentes para iniciar o servio e, 481 nesse caso, essas intenes so entregues. Isto adequado para reprodutores de mdia (ou servios semelhantes) 482 que no estejam executando comandos, mas estejam em execuo indefinidamente e aguardando um trabalho.</dd> 483 <dt>{@link android.app.Service#START_REDELIVER_INTENT}</dt> 484 <dd>Se o sistema eliminar o servio aps o retorno de {@link android.app.Service#onStartCommand 485 onStartCommand()}, recrie o servio e chame {@link 486 android.app.Service#onStartCommand onStartCommand()} com a ltima inteno que foi entregue 487 ao servio. Quaisquer intenes pendentes so entregues, por sua vez. Isto adequado para servios que estejam realizando 488 um trabalho ativamente que deva ser retomado imediatamente, como o download de um arquivo.</dd> 489 </dl> 490 <p>Para obter mais informaes sobre esses valores de retorno, veja a documentao de referncia vinculada 491 a cada constante.</p> 492 493 494 495 <h3 id="StartingAService">Incio de um servio</h3> 496 497 <p> possvel iniciar um dispositivo de uma atividade ou outro componente do aplicativo passando uma 498 {@link android.content.Intent} a {@link 499 android.content.Context#startService startService()}. O sistema Android chama o mtodo {@link 500 android.app.Service#onStartCommand onStartCommand()} do servio e passa a ele a {@link 501 android.content.Intent} (nunca deve-se chamar {@link android.app.Service#onStartCommand 502 onStartCommand()} diretamente).</p> 503 504 <p>Por exemplo, uma atividade pode iniciar o servio de exemplo na seo anterior ({@code 505 HelloSevice}) usando uma inteno explcita com {@link android.content.Context#startService 506 startService()}:</p> 507 508 <pre> 509 Intent intent = new Intent(this, HelloService.class); 510 startService(intent); 511 </pre> 512 513 <p>O mtodo {@link android.content.Context#startService startService()} retorna imediatamente 514 e o sistema Android chama o mtodo {@link android.app.Service#onStartCommand 515 onStartCommand()} do servio. Se o servio no estiver em execuo, o sistemo primeiro chama {@link 516 android.app.Service#onCreate onCreate()} e, em seguida, chama {@link android.app.Service#onStartCommand 517 onStartCommand()}.</p> 518 519 <p>Se o servio no fornecer vinculao, a inteno entregue com {@link 520 android.content.Context#startService startService()} o nico modo de comunicao entre 521 o componente do aplicativo e o servio. No entanto, se quiser que o servio envie um resultado de volta, 522 o cliente que iniciar o servio poder criar um {@link android.app.PendingIntent} para uma transmisso 523 (com {@link android.app.PendingIntent#getBroadcast getBroadcast()}) e entreg-la ao servio 524 na {@link android.content.Intent} que iniciar o servio. O servio pode ento 525 usar a transmisso para entregar um resultado.</p> 526 527 <p>Vrias solicitaes para iniciar o servio resultam em diversas chamadas correspondentes 528 ao {@link android.app.Service#onStartCommand onStartCommand()} do servio. No entanto, somente uma solicitao para interromper 529 o servio (com {@link android.app.Service#stopSelf stopSelf()} ou {@link 530 android.content.Context#stopService stopService()}) necessria para interromp-lo.</p> 531 532 533 <h3 id="Stopping">Interrupo de um servio</h3> 534 535 <p>Um servio iniciado deve gerenciar seu prprio ciclo de vida. Ou seja, o sistema no interrompe 536 ou elimina o servio, a no ser que tenha que recuperar a memria do sistema e o servio 537 continuar em execuo depois que {@link android.app.Service#onStartCommand onStartCommand()} retornar. Portanto, 538 o servio deve ser interrompido chamando {@link android.app.Service#stopSelf stopSelf()} ou outro 539 componente 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 542 android.content.Context#stopService stopService()}, o sistema elimina o servio 543 assim que possvel.</p> 544 545 <p>No entanto, se o servio lida com vrias solicitaes para {@link 546 android.app.Service#onStartCommand onStartCommand()} ao mesmo tempo, no se deve interromper 547 o servio ao terminar o processamento de uma solicitao de inicializao, pois possvel 548 que uma nova solicitao de inicializao tenha ocorrido (interromper no final da primeira solicitao eliminaria a segunda). Para evitar este problema, 549 possvel usar {@link android.app.Service#stopSelf(int)} para garantir que a solicitao 550 que interrompe o servio sempre se baseie na solicitao de inicializao mais recente. Ou seja, ao chamar {@link 551 android.app.Service#stopSelf(int)}, voc passa o ID da solicitao de inicializao (o <code>startId</code> 552 entregue a {@link android.app.Service#onStartCommand onStartCommand()}) para aquele que solicitao de interrompimento 553 corresponde. Em seguida, se o servio receber uma nova solicitao de inicializao antes de ser possvel chamar {@link 554 android.app.Service#stopSelf(int)}, o ID no corresponder e o servio no ser interrompido.</p> 555 556 <p class="caution"><strong>Ateno:</strong> importante que um aplicativo interrompa seus servios 557 quando terminar os trabalhos para evitar o desperdcio dos recursos do sistema e consumo da bateria. Se necessrio, 558 outros componentes podem interromper o servio chamando {@link 559 android.content.Context#stopService stopService()}. Mesmo se for possvel vincular-se ao servio, 560 deve-se sempre interromp-lo por conta prpria se ele tiver recebido uma chamada de {@link 561 android.app.Service#onStartCommand onStartCommand()}.</p> 562 563 <p>Para obter mais informaes sobre o ciclo de vida de um servio, consulte a seo <a href="#Lifecycle">Gerenciamento do ciclo de vida de um servio</a> abaixo.</p> 564 565 566 567 <h2 id="CreatingBoundService">Criao de um servio vinculado</h2> 568 569 <p>Um servio vinculado permite que componentes de aplicativo sejam vinculados chamando {@link 570 android.content.Context#bindService bindService()} para criar uma conexo de longo prazo 571 (e, geralmente, no permite que os componentes o <em>iniciem</em> chamando {@link 572 android.content.Context#startService startService()}).</p> 573 574 <p>Deve-se criar um servio vinculado quando se deseja interagir com o servio a partir de atividades 575 e outros componentes no aplicativo ou para expor algumas das funcionalidades do aplicativo 576 para outros aplicativos, por meio de comunicao entre processos (IPC).</p> 577 578 <p>Para criar um servio vinculado, voc deve implementar o mtodo de retorno de chamada {@link 579 android.app.Service#onBind onBind()} para retornar um {@link android.os.IBinder} 580 que define a interface para a comunicao com o servio. Outros componentes de aplicativo podem chamar 581 {@link android.content.Context#bindService bindService()} para recuperar a interface 582 e comear a chamar mtodos no servio. O servio vive somente para servir o componente do aplicativo 583 ao qual ele est vinculado. Portanto, quando no houver componentes vinculados ao servio, o sistema o eliminar 584 (<em>no</em> necessrio interromper um servio vinculado da mesma maneira que quando o servio iniciado 585 por meio de {@link android.app.Service#onStartCommand onStartCommand()}).</p> 586 587 <p>Para criar um servio vinculado, a primeira coisa a se fazer definir a interface que especifica 588 como um cliente pode comunicar-se com o servidor. Esta interface entre o servio 589 e um cliente deve ser uma implementao de {@link android.os.IBinder} e o que o servio deve retornar 590 a partir do mtodo de retorno de chamada {@link android.app.Service#onBind 591 onBind()}. Quando o cliente receber {@link android.os.IBinder}, ele poder comear 592 a interagir com o servio por meio da interface.</p> 593 594 <p>Vrios clientes podem vincular-se ao servio por vez. Quando um cliente terminar de interagir com o servio, 595 ele chamar {@link android.content.Context#unbindService unbindService()} para desvincular-se. Quando no houver 596 clientes vinculados ao servio, o sistema o eliminar.</p> 597 598 <p>H vrias maneiras de implementar um servio vinculado e a implementao mais complicada 599 que um servio iniciado. Logo, a discusso sobre servios vinculados aparece em um documento separado 600 sobre <a href="{@docRoot}guide/components/bound-services.html">Servios vinculados</a>.</p> 601 602 603 604 <h2 id="Notifications">Enviar notificaes ao usurio</h2> 605 606 <p>Quando em execuo, um servio pode notificar o usurio sobre eventos usando <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Notificaes de aviso</a> ou <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notificaes da barra de status</a>.</p> 607 608 <p>Uma notificao de aviso uma mensagem que aparece na superfcie da janela atual 609 por um breve momento antes de desaparecer, enquanto que uma notificao da barra de status fornece um cone na barra de status 610 com uma mensagem que o usurio pode selecionar para realizar uma ao (como iniciar uma atividade).</p> 611 612 <p>Geralmente, uma notificao da barra de status a melhor tcnica quando um trabalho de segundo plano concludo 613 (como download 614 de arquivo completo) e o usurio pode agir a partir dele. Quando o usurio seleciona a notificao a partir 615 da 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">Notificaes de aviso</a> ou <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notificaes da barra de status</a> 618 para obter mais informaes.</p> 619 620 621 622 <h2 id="Foreground">Execuo de servio em primeiro plano</h2> 623 624 <p>Um servio de primeiro plano aquele 625 com que o usurio est ativamente interagindo e no uma opo para o sistema elimin-lo quando a memria estiver baixa. Um servio de primeiro plano 626 deve fornecer uma notificao para a barra de status, que colocada sob 627 "o cabealho "Em andamento", o que significa que a notificao no pode ser dispensada a no ser que o servio 628 seja interrompido ou removido do primeiro plano.</p> 629 630 <p>Por exemplo, um reprodutor de msica que reproduz a partir de um servio deve ser configurado 631 para permanecer em execuo em primeiro plano, pois o usurio est 632 prestando ateno em sua operao explicitamente. A notificao na barra de status pode indicar a msica atual 633 e permitir que o usurio inicie uma atividade para interagir com o reprodutor de msica.</p> 634 635 <p>Para solicitar que o servio seja executado em primeiro plano, chame {@link 636 android.app.Service#startForeground startForeground()}. Este mtodo usa dois parmetros: um nmero inteiro 637 que identifica unicamente a notificao e {@link 638 android.app.Notification} para a barra de status. Por exemplo:</p> 639 640 <pre> 641 Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text), 642 System.currentTimeMillis()); 643 Intent notificationIntent = new Intent(this, ExampleActivity.class); 644 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); 645 notification.setLatestEventInfo(this, getText(R.string.notification_title), 646 getText(R.string.notification_message), pendingIntent); 647 startForeground(ONGOING_NOTIFICATION_ID, notification); 648 </pre> 649 650 <p class="caution"><strong>Ateno:</strong> O ID do nmero inteiro fornecido para {@link 651 android.app.Service#startForeground startForeground()} no deve ser zero.</p> 652 653 654 <p>Para remover o servio do primeiro plano, chame {@link 655 android.app.Service#stopForeground stopForeground()}. Este mtodo usa um booleano, 656 indicando se deve remover tambm a notificao da barra de status. Este mtodo <em>no</em> interrompe 657 o servio. No entanto, se voc interromper o servio enquanto estiver em execuo em primeiro plano, 658 a notificao tambm ser removida.</p> 659 660 <p>Para obter mais informaes sobre notificaes, consulte <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Criao de notificaes 661 da barra de status</a>.</p> 662 663 664 665 <h2 id="Lifecycle">Gerenciamento do ciclo de vida de um servio</h2> 666 667 <p>O ciclo de vida de um servio muito mais simples do que o de uma atividade. No entanto, ainda mais importante 668 que voc preste muita ateno em como o servio criado e eliminado, pois ele 669 pode ser executado em primeiro plano sem que o usurio esteja ciente.</p> 670 671 <p>O ciclo de vida do servio — desde quando criado at ser eliminado — pode seguir 672 dois caminhos:</p> 673 674 <ul> 675 <li>Um servio iniciado 676 <p>O servio criado quando outro componente chama {@link 677 android.content.Context#startService startService()}. Depois, o servio permanece em execuo indefinidamente e deve 678 interromper-se chamando {@link 679 android.app.Service#stopSelf() stopSelf()}. Outro componente tambm pode interromper 680 o servio chamando {@link 681 android.content.Context#stopService stopService()}. Quando o servio interrompido, o sistema o elimina.</p></li> 682 683 <li>Um servio vinculado 684 <p>O servio criado quando outro componente (um cliente) chama {@link 685 android.content.Context#bindService bindService()}. O cliente comunica-se com o servio 686 pela interface {@link android.os.IBinder}. O cliente pode escolher encerrar a conexo chamando 687 {@link android.content.Context#unbindService unbindService()}. Vrios clientes podem ser vinculados 688 ao mesmo servio e, quando todos os vnculos terminam, o sistema destri o servio (o servio 689 <em>no</em> precisa ser interrompido).</p></li> 690 </ul> 691 692 <p>Esses dois caminhos no so inteiramente separados. Ou seja, possvel vincular um servio 693 que j foi iniciado com {@link android.content.Context#startService startService()}. Por exemplo, um servio de msica 694 de segundo plano pode ser iniciado chamando {@link android.content.Context#startService 695 startService()} com uma {@link android.content.Intent} que identifica a msica reproduzida. Depois, 696 possivelmente quando o usurio quiser exercer mais controle sobre o reprodutor ou obter informaes 697 sobre a msica em reproduo, uma atividade pode ser vinculada ao servio chamando {@link 698 android.content.Context#bindService bindService()}. Em casos como esse, {@link 699 android.content.Context#stopService stopService()} ou {@link android.app.Service#stopSelf 700 stopSelf()} no interrompe o servio at que todos os clientes sejam desvinculados. </p> 701 702 703 <h3 id="LifecycleCallbacks">Implementao de retornos de chamada do ciclo de vida</h3> 704 705 <p>Como uma atividade, um servio tem um mtodo de ciclo de vida que possvel implementar 706 para monitorar as alteraes no estado do servio e realizar trabalhos em momentos adequados. O seguinte servio de esqueleto 707 demonstra cada um dos mtodos de ciclo de vida:</p> 708 709 <pre> 710 public 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>Observao:</strong> diferentemente dos mtodos de retorno de chamada do ciclo de vida da atividade, 747 voc <em>no</em> precisa chamar a implementao 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 servio. O diagrama esquerda 751 mostra o ciclo de vida quando o servio criado com {@link android.content.Context#startService 752 startService()} e o diagrama direita mostra o ciclo de vida quando o servio 753 criado com {@link android.content.Context#bindService bindService()}.</p> 754 755 <p>Ao implementar esses mtodos, possvel monitorar dois retornos (loops) aninhados no ciclo de vida do servio: </p> 756 757 <ul> 758 <li><strong>Todo o ciclo de vida</strong> de um servio acontece entre o momento em que {@link 759 android.app.Service#onCreate onCreate()} chamado e em que {@link 760 android.app.Service#onDestroy} retorna. Como uma atividade, um servio faz a sua configurao inicial 761 em {@link android.app.Service#onCreate onCreate()} e libera todos os recursos restantes em {@link 762 android.app.Service#onDestroy onDestroy()}. Por exemplo, 763 um servio de reproduo de msica pode criar um encadeamento onde a msica ser reproduzida em {@link 764 android.app.Service#onCreate onCreate()}, e interromper o encadeamento em {@link 765 android.app.Service#onDestroy onDestroy()}. 766 767 <p>Os mtodos {@link android.app.Service#onCreate onCreate()} e {@link android.app.Service#onDestroy 768 onDestroy()} so chamados para todos os servios, 769 se tiverem sido criados por {@link android.content.Context#startService startService()} ou {@link 770 android.content.Context#bindService bindService()}.</p></li> 771 772 <li>O <strong>ciclo de vida ativo</strong> de um servio comea com uma chamada de {@link 773 android.app.Service#onStartCommand onStartCommand()} ou {@link android.app.Service#onBind onBind()}. 774 Cada mtodo entrega a {@link 775 android.content.Intent} que foi passada para {@link android.content.Context#startService 776 startService()} ou {@link android.content.Context#bindService bindService()}, respectivamente. 777 <p>Se o servio for iniciado, o ciclo de vida ativo terminar no mesmo momento 778 em que o ciclo de vida inteiro terminar (o servio permanece ativo mesmo aps o retorno de {@link android.app.Service#onStartCommand 779 onStartCommand()}). Se o servio estiver vinculado, o ciclo de ida ativo acabar quando {@link 780 android.app.Service#onUnbind onUnbind()} retornar.</p> 781 </li> 782 </ul> 783 784 <p class="note"><strong>Observao:</strong> apesar de um servio iniciado ser interrompido com uma chamada 785 de {@link android.app.Service#stopSelf stopSelf()} ou {@link 786 android.content.Context#stopService stopService()}, no h um retorno de chamada respectivo 787 para o servio (no h retorno de chamada de {@code onStop()}). Portanto, a no ser que o servio esteja vinculado a um cliente, 788 o sistema o eliminar quando for interrompido — {@link 789 android.app.Service#onDestroy onDestroy()} ser o nico retorno de chamada recebido.</p> 790 791 <p>A figura 2 ilustra os mtodos de retorno de chamada tradicionais para um servio. Apesar de a figura separar 792 os servios que so criados por {@link android.content.Context#startService startService()} 793 daqueles que so criados por {@link android.content.Context#bindService bindService()}, 794 observe que qualquer servio, no importa como foi iniciado, pode permitir a vinculao de clientes. 795 Portanto, um servio que j foi iniciado com {@link android.app.Service#onStartCommand 796 onStartCommand()} (por um cliente chamando {@link android.content.Context#startService startService()}) 797 ainda 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 informaes sobre como criar um servio que fornea vinculao, consulte o documento <a href="{@docRoot}guide/components/bound-services.html">Servios vinculados</a>, 801 que aborda mais profundamente o mtodo de retorno de chamada {@link android.app.Service#onRebind onRebind()} 802 na seo sobre <a href="{@docRoot}guide/components/bound-services.html#Lifecycle">Gerenciamento do ciclo de vida 803 de um servio 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 810 stored on the device), continue with the <b><a 811 href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a></b> 812 document.</p> 813 --> 814