1page.title=Serviços vinculados 2parent.title=Serviços 3parent.link=services.html 4@jd:body 5 6 7<div id="qv-wrapper"> 8<ol id="qv"> 9<h2>Neste documento</h2> 10<ol> 11 <li><a href="#Basics">Conceitos básicos</a></li> 12 <li><a href="#Creating">Criação de um serviço vinculado</a> 13 <ol> 14 <li><a href="#Binder">Extensão da classe Binder</a></li> 15 <li><a href="#Messenger">Uso de um mensageiro</a></li> 16 </ol> 17 </li> 18 <li><a href="#Binding">Vinculação a um serviço</a></li> 19 <li><a href="#Lifecycle">Gerenciamento do ciclo de vida de um serviço vinculado</a></li> 20</ol> 21 22<h2>Classes principais</h2> 23<ol> 24 <li>{@link android.app.Service}</li> 25 <li>{@link android.content.ServiceConnection}</li> 26 <li>{@link android.os.IBinder}</li> 27</ol> 28 29<h2>Exemplos</h2> 30<ol> 31 <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code 32 RemoteService}</a></li> 33 <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code 34 LocalService}</a></li> 35</ol> 36 37<h2>Veja também</h2> 38<ol> 39 <li><a href="{@docRoot}guide/components/services.html">Serviços</a></li> 40</ol> 41</div> 42 43 44<p>Um serviço vinculado é o servidor em uma interface servidor-cliente. Um serviço vinculado permite que componentes 45(como atividades) sejam vinculados ao serviço, enviem solicitações, recebam respostas e até estabeleçam 46comunicação entre processos (IPC). Um serviço vinculado, geralmente, vive somente enquanto serve 47outro componente do aplicativo e não é executado em segundo plano indefinidamente.</p> 48 49<p>Este documento mostra como criar um serviço vinculado, inclusive como criar vínculos 50com o serviço a partir de outros componentes do aplicativo. No entanto, você também deve consultar a documentação <a href="{@docRoot}guide/components/services.html">Serviços</a> para obter 51informações adicionais sobre serviços de forma geral, por exemplo: como enviar notificações de um serviço, 52como definir o serviço a ser executado em primeiro plano etc.</p> 53 54 55<h2 id="Basics">Conceitos básicos</h2> 56 57<p>Um serviço vinculado é uma implementação da classe {@link android.app.Service} que permite 58que outros aplicativos sejam vinculados e interajam com ele. Para fornecer a vinculação 59a um serviço, você deve implementar o método de retorno de chamada {@link android.app.Service#onBind onBind()}. Este método 60retorna um objeto {@link android.os.IBinder} que define a interface de programação 61que os clientes podem usar para interagir com o serviço.</p> 62 63<div class="sidebox-wrapper"> 64<div class="sidebox"> 65 <h3>Vinculação com um serviço iniciado</h3> 66 67<p>Como discutido na documentação <a href="{@docRoot}guide/components/services.html">Serviços</a>, 68é possível criar um serviço que já foi iniciado e vinculado. Ou seja, o serviço pode 69ser iniciado chamando {@link android.content.Context#startService startService()}, que permite que ele 70permaneça em execução indefinidamente e também permite que um cliente vincule-o chamando {@link 71android.content.Context#bindService bindService()}. 72 <p>Se você permitir que o serviço seja iniciado e vinculado, então, quando ele 73for iniciado, o sistema <em>não</em> o destruirá quando todos os clientes desfizerem a vínculo. Em vez disso, você deve 74interromper o serviço explicitamente chamando {@link android.app.Service#stopSelf stopSelf()} ou {@link 75android.content.Context#stopService stopService()}.</p> 76 77<p>Apesar de normalmente se implementar {@link android.app.Service#onBind onBind()} 78<em>ou</em> {@link android.app.Service#onStartCommand onStartCommand()}, às vezes 79é necessário implementar ambos. Por exemplo, um reprodutor de música pode achar útil permitir que o seu serviço 80permaneça em execução indefinidamente, além de fornecer vinculação. Desta forma, uma atividade pode iniciar o serviço 81para reproduzir algumas músicas e a música continuará em reprodução mesmo quando o usuário sair do aplicativo. Em seguida, quando o usuário 82voltar ao aplicativo, a atividade poderá vincular-se ao serviço para retomar o controle da reprodução.</p> 83 84<p>Certifique-se de ler a seção sobre <a href="#Lifecycle">Gerenciamento do ciclo de vida de um serviço 85vinculado</a> para obter mais informações sobre o ciclo de vida do serviço ao adicionar vinculação 86a um serviço iniciado.</p> 87</div> 88</div> 89 90<p>Um cliente pode vincular-se ao serviço chamando {@link android.content.Context#bindService 91bindService()}. Quando isto ocorre, é preciso fornecer uma implementação de {@link 92android.content.ServiceConnection}, que monitora a conexão com o serviço. O método {@link 93android.content.Context#bindService bindService()} retorna imediatamente sem um valor, 94mas quando o sistema Android cria a conexão entre 95o cliente e o serviço, ele chama {@link 96android.content.ServiceConnection#onServiceConnected onServiceConnected()} em {@link 97android.content.ServiceConnection} para fornecer o {@link android.os.IBinder} 98que o cliente pode usar para comunicar-se com o serviço.</p> 99 100<p>Vários clientes podem conectar-se ao serviço de uma vez. No entanto, o sistema chama o método 101{@link android.app.Service#onBind onBind()} do serviço para recuperar o {@link android.os.IBinder} 102somente quando o primeiro cliente é vinculado. Em seguida, o sistema entrega o mesmo {@link android.os.IBinder} 103para quaisquer clientes adicionais que vincularem-se, sem chamar {@link android.app.Service#onBind onBind()} novamente.</p> 104 105<p>Quando o último cliente desvincular-se do serviço, o sistema destruirá o serviço 106(a não ser que ele também seja iniciado por {@link android.content.Context#startService startService()}).</p> 107 108<p>Ao implementar o serviço vinculado, o mais importante é definir a interface 109que o método de retorno de chamada {@link android.app.Service#onBind onBind()} retornará. Há poucas maneiras diferentes 110de definir a interface {@link android.os.IBinder} do serviço e a 111seção a seguir discute cada técnica.</p> 112 113 114 115<h2 id="Creating">Criação de um serviço vinculado</h2> 116 117<p>Ao criar um serviço que fornece vinculação, você deve fornecer um {@link android.os.IBinder} 118que ofereça a interface de programação que os clientes podem usar para interagir com o serviço. Há três maneiras 119possíveis de definir a interface:</p> 120 121<dl> 122 <dt><a href="#Binder">Extensão da classe Binder</a></dt> 123 <dd>Se o serviço for privado para o próprio aplicativo e for executado no mesmo processo que o cliente 124(o que é comum), deve-se criar a interface estendendo-se a classe {@link android.os.Binder} 125e retornando uma instância dela a partir de 126{@link android.app.Service#onBind onBind()}. O cliente receberá {@link android.os.Binder} 127e poderá usá-lo para acessar os métodos públicos disponíveis na implementação de {@link android.os.Binder} 128ou até em {@link android.app.Service} diretamente. 129 <p>Esta é a técnica preferencial quando o serviço é meramente um trabalhador de segundo plano 130para o aplicativo. O único motivo pelo qual não se criaria a interface desta maneira 131é porque o serviço está sendo usado por outros aplicativos ou em processos separados.</dd> 132 133 <dt><a href="#Messenger">Uso de um mensageiro</a></dt> 134 <dd>Caso precise que a interface funcione em diferentes processos, é possível 135criar uma interface para o serviço com {@link android.os.Messenger}. Desta maneira, o serviço 136define um {@link android.os.Handler} que responde a diferentes tipos de objetos {@link 137android.os.Message}. Este {@link android.os.Handler} 138é a base para {@link android.os.Messenger}, que pode então compartilhar um {@link android.os.IBinder} 139com o cliente, permitindo que ele envie comandos ao serviço usando objetos {@link 140android.os.Message}. Além disso, o cliente pode definir o próprio {@link android.os.Messenger} 141para que o serviço possa enviar as mensagens de volta. 142 <p>Esta é a maneira mais simples de estabelecer comunicação entre processos (IPC), pois o {@link 143android.os.Messenger} coloca todas as solicitações em fila em um único encadeamento para que você não precise 144projetar o serviço de modo que seja seguro para encadeamentos.</p> 145 </dd> 146 147 <dt>Uso de AIDL</dt> 148 <dd>O AIDL (Android Interface Definition Language, linguagem de definição de interface do Android) realiza todo o trabalho de decomposição de objetos 149em primitivos para que o sistema operacional possa entendê-los e dispô-los em processos 150para realizar a IPC. A técnica anterior, usando o {@link android.os.Messenger}, tem base em AIDL 151como a estrutura fundamental. Como mencionado acima, o {@link android.os.Messenger} cria uma fila 152de todas as solicitações de cliente em um único encadeamento para que o serviço receba uma solicitação por vez. Se, no entanto, 153você quiser que o serviço lide com várias solicitações simultaneamente, é possível usar a AIDL 154diretamente. Neste caso, o serviço deverá ser capaz de realizar vários encadeamentos e ser programado de forma segura para encadeamentos. 155 <p>Para usar a AIDL diretamente, deve-se 156criar um arquivo {@code .aidl} que defina a interface de programação. As ferramentas SDK do Android 157usam este arquivo para gerar uma classe abstrata que implemente a interface e lide com a IPC, 158que pode ser estendida dentro do serviço.</p> 159 </dd> 160</dl> 161 162 <p class="note"><strong>Observação:</strong> a maioria dos aplicativos <strong>não deve</strong> usar a AIDL 163para criar um serviço vinculado, pois isto requer capacidade de se trabalhar com encadeamentos múltiplos 164e pode resultar em uma implementação mais complicada. Portanto, a AIDL não é adequada para a maioria dos aplicativos 165e este documento não discute o seu uso para o serviço. Caso tenha certeza de que 166precisa usar a AIDL diretamente, consulte a documentação 167<a href="{@docRoot}guide/components/aidl.html">AIDL</a>.</p> 168 169 170 171 172<h3 id="Binder">Extensão da classe Binder</h3> 173 174<p>Se o serviço for usado somente pelo aplicativo local e não precisar trabalhar entre processos, 175então será possível implementar a própria classe {@link android.os.Binder} que fornece ao cliente 176acesso direto aos métodos públicos no serviço.</p> 177 178<p class="note"><strong>Observação:</strong> isto funciona somente se o cliente e o serviço 179estiverem no mesmo aplicativo e processo, o que é muito comum. Por exemplo, isto funcionaria bem para um 180aplicativo de música que precise vincular uma atividade ao próprio serviço que está 181reproduzindo música em segundo plano.</p> 182 183<p>Como configurar:</p> 184<ol> 185 <li>No serviço, crie uma instância de {@link android.os.Binder} que: 186 <ul> 187 <li>contenha métodos públicos que o cliente possa chamar</li> 188 <li>retorne ao cliente a instância {@link android.app.Service}, que tenha métodos públicos 189que ele possa chamar</li> 190 <li>ou retorne uma instância de outra classe hospedada pelo serviço com métodos públicos 191que o cliente possa chamar</li> 192 </ul> 193 <li>Retorne esta instância de {@link android.os.Binder} a partir do método de retorno de chamada {@link 194android.app.Service#onBind onBind()}.</li> 195 <li>No cliente, receba o {@link android.os.Binder} a partir do método de retorno de chamada {@link 196android.content.ServiceConnection#onServiceConnected onServiceConnected()} 197e faça chamadas para o serviços vinculados usando os métodos fornecidos.</li> 198</ol> 199 200<p class="note"><strong>Observação:</strong> o motivo pelo qual o serviço e o cliente devem estar no mesmo aplicativo 201é para que o cliente possa lançar o objeto retornado e chamar as APIs adequadamente. O serviço e o cliente 202também devem estar no mesmo processo, pois esta técnica não possui 203nenhuma ingerência entre processos.</p> 204 205<p>Por exemplo, a seguir há um serviço que fornece aos clientes acesso aos métodos no serviço 206por meio de uma implementação de {@link android.os.Binder}:</p> 207 208<pre> 209public class LocalService extends Service { 210 // Binder given to clients 211 private final IBinder mBinder = new LocalBinder(); 212 // Random number generator 213 private final Random mGenerator = new Random(); 214 215 /** 216 * Class used for the client Binder. Because we know this service always 217 * runs in the same process as its clients, we don't need to deal with IPC. 218 */ 219 public class LocalBinder extends Binder { 220 LocalService getService() { 221 // Return this instance of LocalService so clients can call public methods 222 return LocalService.this; 223 } 224 } 225 226 @Override 227 public IBinder onBind(Intent intent) { 228 return mBinder; 229 } 230 231 /** method for clients */ 232 public int getRandomNumber() { 233 return mGenerator.nextInt(100); 234 } 235} 236</pre> 237 238<p>O {@code LocalBinder} fornece o método {@code getService()} para que os clientes 239recuperem a instância atual de {@code LocalService}. Isto permite que os clientes chamem métodos públicos 240no serviço. Por exemplo, eles podem chamar {@code getRandomNumber()} a partir do serviço.</p> 241 242<p>Abaixo há uma atividade que vincula-se a {@code LocalService} e chama {@code getRandomNumber()} 243quando um botão é pressionado:</p> 244 245<pre> 246public class BindingActivity extends Activity { 247 LocalService mService; 248 boolean mBound = false; 249 250 @Override 251 protected void onCreate(Bundle savedInstanceState) { 252 super.onCreate(savedInstanceState); 253 setContentView(R.layout.main); 254 } 255 256 @Override 257 protected void onStart() { 258 super.onStart(); 259 // Bind to LocalService 260 Intent intent = new Intent(this, LocalService.class); 261 bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 262 } 263 264 @Override 265 protected void onStop() { 266 super.onStop(); 267 // Unbind from the service 268 if (mBound) { 269 unbindService(mConnection); 270 mBound = false; 271 } 272 } 273 274 /** Called when a button is clicked (the button in the layout file attaches to 275 * this method with the android:onClick attribute) */ 276 public void onButtonClick(View v) { 277 if (mBound) { 278 // Call a method from the LocalService. 279 // However, if this call were something that might hang, then this request should 280 // occur in a separate thread to avoid slowing down the activity performance. 281 int num = mService.getRandomNumber(); 282 Toast.makeText(this, "number: " + num, Toast.LENGTH_SHORT).show(); 283 } 284 } 285 286 /** Defines callbacks for service binding, passed to bindService() */ 287 private ServiceConnection mConnection = new ServiceConnection() { 288 289 @Override 290 public void onServiceConnected(ComponentName className, 291 IBinder service) { 292 // We've bound to LocalService, cast the IBinder and get LocalService instance 293 LocalBinder binder = (LocalBinder) service; 294 mService = binder.getService(); 295 mBound = true; 296 } 297 298 @Override 299 public void onServiceDisconnected(ComponentName arg0) { 300 mBound = false; 301 } 302 }; 303} 304</pre> 305 306<p>O exemplo acima mostra como o cliente vincula um serviço usando uma implementação 307de {@link android.content.ServiceConnection} e o retorno de chamada {@link 308android.content.ServiceConnection#onServiceConnected onServiceConnected()}. A próxima seção 309fornece mais informações sobre este processo de vinculação ao serviço.</p> 310 311<p class="note"><strong>Observação:</strong> o exemplo acima não desfaz a vinculação explicitamente a partir do serviço, 312mas todos os clientes devem fazê-lo no momento adequado (como quando a atividade pausa).</p> 313 314<p>Para obter mais códigos de exemplo, consulte a classe <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code 315LocalService.java}</a> e a classe <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.html">{@code 316LocalServiceActivities.java}</a> em <a href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a>.</p> 317 318 319 320 321 322<h3 id="Messenger">Uso de um mensageiro</h3> 323 324<div class="sidebox-wrapper"> 325<div class="sidebox"> 326 <h4>Comparado ao AIDL</h4> 327 <p>Quando é necessário fazer uma IPC, usar o {@link android.os.Messenger} para a interface 328é mais simples do que implementá-la com AIDL, pois o {@link android.os.Messenger} enfileira 329todas as chamadas do serviço, enquanto que uma interface de AIDL pura envia solicitações simultâneas 330ao serviço, que deve então lidar com vários encadeamentos.</p> 331 <p>Para a maioria dos aplicativos, o serviço não precisa realizar vários encadeamentos. Portanto, usar {@link 332android.os.Messenger} permite que o serviço lide com uma chamada por vez. Caso seja importante 333que o serviço realize vários encadeamentos, deve-se usar a <a href="{@docRoot}guide/components/aidl.html">AIDL</a> para definir a interface.</p> 334</div> 335</div> 336 337<p>Caso precise que o serviço comunique-se com processos remotos, é possível usar 338o {@link android.os.Messenger} para fornecer a interface ao serviço. Esta técnica permite 339estabelecer comunicação entre processos (IPC) sem precisar usar a AIDL.</p> 340 341<p>A seguir há um resumo sobre como usar um {@link android.os.Messenger}:</p> 342 343<ul> 344 <li>O serviço implementa um {@link android.os.Handler} que recebe um retorno de chamada 345para cada chamada de um cliente.</li> 346 <li>O {@link android.os.Handler} é usado para criar um objeto {@link android.os.Messenger} 347(que é uma referência para o {@link android.os.Handler}).</li> 348 <li>O {@link android.os.Messenger} cria um {@link android.os.IBinder} que o serviço 349retorna aos clientes a partir de {@link android.app.Service#onBind onBind()}.</li> 350 <li>Os clientes usam {@link android.os.IBinder} para instanciar o {@link android.os.Messenger} 351(que menciona o {@link android.os.Handler} do serviço), que usam para enviar objetos 352{@link android.os.Message} para o serviço.</li> 353 <li>O serviço recebe cada {@link android.os.Message} em seu {@link 354android.os.Handler} — especificamente, no método {@link android.os.Handler#handleMessage 355handleMessage()}.</li> 356</ul> 357 358 359<p>Desta forma, não há "métodos" para o cliente chamar no serviço. Em vez disso, o cliente 360envia "mensagens" (objetos {@link android.os.Message}) que o serviço recebe 361no {@link android.os.Handler}.</p> 362 363<p>Abaixo há um exemplo simples de serviço que usa uma interface {@link android.os.Messenger}:</p> 364 365<pre> 366public class MessengerService extends Service { 367 /** Command to the service to display a message */ 368 static final int MSG_SAY_HELLO = 1; 369 370 /** 371 * Handler of incoming messages from clients. 372 */ 373 class IncomingHandler extends Handler { 374 @Override 375 public void handleMessage(Message msg) { 376 switch (msg.what) { 377 case MSG_SAY_HELLO: 378 Toast.makeText(getApplicationContext(), "hello!", Toast.LENGTH_SHORT).show(); 379 break; 380 default: 381 super.handleMessage(msg); 382 } 383 } 384 } 385 386 /** 387 * Target we publish for clients to send messages to IncomingHandler. 388 */ 389 final Messenger mMessenger = new Messenger(new IncomingHandler()); 390 391 /** 392 * When binding to the service, we return an interface to our messenger 393 * for sending messages to the service. 394 */ 395 @Override 396 public IBinder onBind(Intent intent) { 397 Toast.makeText(getApplicationContext(), "binding", Toast.LENGTH_SHORT).show(); 398 return mMessenger.getBinder(); 399 } 400} 401</pre> 402 403<p>Observe que o método {@link android.os.Handler#handleMessage handleMessage()} 404no {@link android.os.Handler} é onde o serviço recebe a {@link android.os.Message} 405e decide o que fazer, com base no membro {@link android.os.Message#what}.</p> 406 407<p>Tudo que o cliente precisa fazer é criar um {@link android.os.Messenger} com base no {@link 408android.os.IBinder} retornado pelo serviço e enviar uma mensagem usando {@link 409android.os.Messenger#send send()}. Por exemplo, a seguir há uma atividade simples que vincula-se 410ao serviço e envia a mensagem {@code MSG_SAY_HELLO} a ele:</p> 411 412<pre> 413public class ActivityMessenger extends Activity { 414 /** Messenger for communicating with the service. */ 415 Messenger mService = null; 416 417 /** Flag indicating whether we have called bind on the service. */ 418 boolean mBound; 419 420 /** 421 * Class for interacting with the main interface of the service. 422 */ 423 private ServiceConnection mConnection = new ServiceConnection() { 424 public void onServiceConnected(ComponentName className, IBinder service) { 425 // This is called when the connection with the service has been 426 // established, giving us the object we can use to 427 // interact with the service. We are communicating with the 428 // service using a Messenger, so here we get a client-side 429 // representation of that from the raw IBinder object. 430 mService = new Messenger(service); 431 mBound = true; 432 } 433 434 public void onServiceDisconnected(ComponentName className) { 435 // This is called when the connection with the service has been 436 // unexpectedly disconnected -- that is, its process crashed. 437 mService = null; 438 mBound = false; 439 } 440 }; 441 442 public void sayHello(View v) { 443 if (!mBound) return; 444 // Create and send a message to the service, using a supported 'what' value 445 Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0); 446 try { 447 mService.send(msg); 448 } catch (RemoteException e) { 449 e.printStackTrace(); 450 } 451 } 452 453 @Override 454 protected void onCreate(Bundle savedInstanceState) { 455 super.onCreate(savedInstanceState); 456 setContentView(R.layout.main); 457 } 458 459 @Override 460 protected void onStart() { 461 super.onStart(); 462 // Bind to the service 463 bindService(new Intent(this, MessengerService.class), mConnection, 464 Context.BIND_AUTO_CREATE); 465 } 466 467 @Override 468 protected void onStop() { 469 super.onStop(); 470 // Unbind from the service 471 if (mBound) { 472 unbindService(mConnection); 473 mBound = false; 474 } 475 } 476} 477</pre> 478 479<p>Observe que este exemplo não mostra como o serviço pode responder ao cliente. Caso queira que o serviço responda, 480é necessário criar um {@link android.os.Messenger} no cliente também. Em seguida, 481quando o cliente receber o retorno de chamada de {@link android.content.ServiceConnection#onServiceConnected 482onServiceConnected()}, ele enviará uma {@link android.os.Message} para o serviço que inclui 483o {@link android.os.Messenger} no parâmetro {@link android.os.Message#replyTo} 484do método {@link android.os.Messenger#send send()}.</p> 485 486<p>É possível ver um exemplo de como fornecer mensagens de duas vias nos exemplos <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerService.html">{@code 487MessengerService.java}</a> (serviço) e <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.html">{@code 488MessengerServiceActivities.java}</a> (cliente).</p> 489 490 491 492 493 494<h2 id="Binding">Vinculação a um serviço</h2> 495 496<p>Um componente de aplicativo (cliente) pode vincular-se a um serviço chamando 497{@link android.content.Context#bindService bindService()}. O sistema Android, em seguida, 498chama o método {@link android.app.Service#onBind 499onBind()} do serviço, que retorna um {@link android.os.IBinder} para interagir com o serviço.</p> 500 501<p>A vinculação é assíncrona. {@link android.content.Context#bindService 502bindService()} retorna imediatamente e <em>não</em> retorna o {@link android.os.IBinder} 503ao cliente. Para receber {@link android.os.IBinder}, o cliente deve criar uma instância de {@link 504android.content.ServiceConnection} e passá-la para {@link android.content.Context#bindService 505bindService()}. O {@link android.content.ServiceConnection} inclui um método de retorno de chamada 506que o sistema chama para entregar o {@link android.os.IBinder}.</p> 507 508<p class="note"><strong>Observação:</strong> somente atividades, serviços e provedores de conteúdo 509podem vincular-se a um serviço — você <strong>não</strong> pode fazer isto a partir de um receptor de transmissão.</p> 510 511<p>Portanto, para vincular-se a um serviço a partir do cliente, deve-se: </p> 512<ol> 513 <li>Implementar {@link android.content.ServiceConnection}. 514 <p>Sua implementação deve substituir dois métodos de retorno de chamada:</p> 515 <dl> 516 <dt>{@link android.content.ServiceConnection#onServiceConnected onServiceConnected()}</dt> 517 <dd>O sistema chama isto para entregar o {@link android.os.IBinder} retornado 518pelo método {@link android.app.Service#onBind onBind()} do serviço.</dd> 519 <dt>{@link android.content.ServiceConnection#onServiceDisconnected 520onServiceDisconnected()}</dt> 521 <dd>O sistema Android chama isto quando a conexão ao serviço é perdida inesperadamente, 522 como quando o serviço apresenta problemas ou é fechado repentinamente. Isto <em>não</em> é chamado quando 523o cliente desfaz o vínculo.</dd> 524 </dl> 525 </li> 526 <li>Chamar {@link 527android.content.Context#bindService bindService()}, passando a implementação {@link 528android.content.ServiceConnection}. </li> 529 <li>Quando o sistema chamar o método de retorno de chamada {@link android.content.ServiceConnection#onServiceConnected 530onServiceConnected()}, é possível fazer chamadas para o serviço 531usando os métodos definidos pela interface.</li> 532 <li>Para desconectar-se de um serviço, chamar {@link 533android.content.Context#unbindService unbindService()}. 534 <p>Quando um cliente é destruído, o vínculo com o serviço acaba. No entanto, sempre desvincule-se 535ao terminar a interação com o serviço ou quando a atividade pausar para que o serviço 536possa ser encerrado enquanto não estiver em uso (os momentos adequados para vincular ou desvincular 537são abordados mais abaixo).</p> 538 </li> 539</ol> 540 541<p>Por exemplo, o fragmento a seguir conecta o cliente ao serviço criado acima 542<a href="#Binder">estendendo a classe Binder</a> para que tudo que ele tenha que fazer seja lançar 543o {@link android.os.IBinder} retornado para a classe {@code LocalService} e solicitar a instância de {@code 544LocalService}:</p> 545 546<pre> 547LocalService mService; 548private ServiceConnection mConnection = new ServiceConnection() { 549 // Called when the connection with the service is established 550 public void onServiceConnected(ComponentName className, IBinder service) { 551 // Because we have bound to an explicit 552 // service that is running in our own process, we can 553 // cast its IBinder to a concrete class and directly access it. 554 LocalBinder binder = (LocalBinder) service; 555 mService = binder.getService(); 556 mBound = true; 557 } 558 559 // Called when the connection with the service disconnects unexpectedly 560 public void onServiceDisconnected(ComponentName className) { 561 Log.e(TAG, "onServiceDisconnected"); 562 mBound = false; 563 } 564}; 565</pre> 566 567<p>Com este {@link android.content.ServiceConnection}, o cliente pode vincular-se a um serviço 568passando-o para {@link android.content.Context#bindService bindService()}. Por exemplo:</p> 569 570<pre> 571Intent intent = new Intent(this, LocalService.class); 572bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 573</pre> 574 575<ul> 576 <li>O primeiro parâmetro de {@link android.content.Context#bindService bindService()} 577é uma {@link android.content.Intent} que nomeia explicitamente o serviço que será vinculado (apesar de a intenção 578poder ser implícita).</li> 579<li>O segundo parâmetro é o objeto {@link android.content.ServiceConnection}.</li> 580<li>O terceiro parâmetro é um sinalizador que indica as opções de vinculação. Geralmente, ele deve ser {@link 581android.content.Context#BIND_AUTO_CREATE} para criar o serviço se não estiver ativo ainda. 582Outros possíveis valores são {@link android.content.Context#BIND_DEBUG_UNBIND} 583e {@link android.content.Context#BIND_NOT_FOREGROUND}, ou {@code 0} para nada.</li> 584</ul> 585 586 587<h3>Observações adicionais</h3> 588 589<p>A seguir há algumas observações importantes sobre a vinculação com um serviço:</p> 590<ul> 591 <li>Deve-se sempre capturar exceções{@link android.os.DeadObjectException}, que são lançadas 592quando a conexão apresenta erros. Esta é a única exceção lançada por métodos remotos.</li> 593 <li>Objetos são referências contadas em todos os processos. </li> 594 <li>Geralmente, alterna-se entre a vinculação e a desvinculação 595durante os momentos crescentes e decrescentes do ciclo de vida do cliente. Por exemplo: 596 <ul> 597 <li>Caso precise interagir com o serviço enquanto a atividade estiver visível, 598deve-se vincular durante {@link android.app.Activity#onStart onStart()} e desvincular durante {@link 599android.app.Activity#onStop onStop()}.</li> 600 <li>Caso queira que a atividade receba mensagens mesmo quando for interrompida 601em segundo plano, é possível vincular durante {@link android.app.Activity#onCreate onCreate()} 602e desvincular durante {@link android.app.Activity#onDestroy onDestroy()}. Cuidado, pois isto significa que a atividade 603precisa usar o serviço durante todo o tempo de execução (mesmo em segundo plano). 604Portanto, se o serviço estiver em outro processo, o peso do processo será aumentado 605e é mais provável que o sistema elimine-o.</li> 606 </ul> 607 <p class="note"><strong>Observação:</strong> geralmente, <strong>não</strong> se realiza o vínculo e o seu rompimento 608durante o {@link android.app.Activity#onResume onResume()} e o {@link 609android.app.Activity#onPause onPause()} da atividade, pois esses retornos de chamada ocorrem em todas as transições do ciclo de vida 610e deve-se usar menos processamento possível nessas transações. Além disso, 611se várias atividades no aplicativo vincularem-se ao mesmo serviço e houver uma transação entre duas 612dessas atividades, o serviço poderá ser destruído e recriado à medida que a atividade desvincula-se, 613durante a pausa, antes do próximo vínculo, durante a retomada (esta transição de atividade 614para como as atividades coordenam os ciclos de vida é descrita no documento <a href="{@docRoot}guide/components/activities.html#CoordinatingActivities">Atividades</a> 615).</p> 616</ul> 617 618<p>Para obter mais códigos de exemplo mostrando como vincular a um serviço, consulte a classe <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code 619RemoteService.java}</a> no <a href="{@docRoot}resources/samples/ApiDemos/index.html">ApiDemos</a>.</p> 620 621 622 623 624 625<h2 id="Lifecycle">Gerenciamento do ciclo de vida de um serviço vinculado</h2> 626 627<p>Quando um serviço é desvinculado de todos os clientes, o sistema Android o destrói (a não ser que ele 628também tenha sido inicializado com {@link android.app.Service#onStartCommand onStartCommand()}). Portanto, não é necessário 629gerenciar o ciclo de vida do serviço se ele for puramente um serviço vinculado 630— o sistema Android o gerencia com base nos vínculos com os clientes.</p> 631 632<p>No entanto, se você escolher implementar o método de retorno de chamada {@link android.app.Service#onStartCommand 633onStartCommand()}, interrompa o serviço explicitamente, pois o serviço 634já terá sido considerado como <em>iniciado</em>. Neste caso, o serviço permanece em execução até 635ser interrompido com {@link android.app.Service#stopSelf()} ou outras chamadas de componente {@link 636android.content.Context#stopService stopService()}, independente de vínculo 637com qualquer cliente.</p> 638 639<p>Além disso, se o serviço for iniciado e aceitar vínculos, quando o sistema chamar 640o método {@link android.app.Service#onUnbind onUnbind()}, será possível retornar 641{@code true} opcionalmente se você quiser receber uma chamada de {@link android.app.Service#onRebind 642onRebind()} na próxima vez em que um cliente vincular-se ao serviço (em vez de receber uma chamada de {@link 643android.app.Service#onBind onBind()}). {@link android.app.Service#onRebind 644onRebind()} retorna vazio, mas o cliente ainda recebe {@link android.os.IBinder} 645no retorno de chamada {@link android.content.ServiceConnection#onServiceConnected onServiceConnected()}. 646Abaixo, a figura 1 ilustra a lógica para este tipo de ciclo de vida.</p> 647 648 649<img src="{@docRoot}images/fundamentals/service_binding_tree_lifecycle.png" alt="" /> 650<p class="img-caption"><strong>Figura 1.</strong> O ciclo de vida para um serviço que é iniciado 651e também permite vínculos.</p> 652 653 654<p>Para obter mais informações sobre o ciclo de vida de um serviço iniciado, consulte o documento <a href="{@docRoot}guide/components/services.html#Lifecycle">Serviços</a>.</p> 655 656 657 658 659