1 page.title=Servios vinculados 2 parent.title=Servios 3 parent.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 bsicos</a></li> 12 <li><a href="#Creating">Criao de um servio vinculado</a> 13 <ol> 14 <li><a href="#Binder">Extenso 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">Vinculao a um servio</a></li> 19 <li><a href="#Lifecycle">Gerenciamento do ciclo de vida de um servio 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 tambm</h2> 38 <ol> 39 <li><a href="{@docRoot}guide/components/services.html">Servios</a></li> 40 </ol> 41 </div> 42 43 44 <p>Um servio vinculado o servidor em uma interface servidor-cliente. Um servio vinculado permite que componentes 45 (como atividades) sejam vinculados ao servio, enviem solicitaes, recebam respostas e at estabeleam 46 comunicao entre processos (IPC). Um servio vinculado, geralmente, vive somente enquanto serve 47 outro componente do aplicativo e no executado em segundo plano indefinidamente.</p> 48 49 <p>Este documento mostra como criar um servio vinculado, inclusive como criar vnculos 50 com o servio a partir de outros componentes do aplicativo. No entanto, voc tambm deve consultar a documentao <a href="{@docRoot}guide/components/services.html">Servios</a> para obter 51 informaes adicionais sobre servios de forma geral, por exemplo: como enviar notificaes de um servio, 52 como definir o servio a ser executado em primeiro plano etc.</p> 53 54 55 <h2 id="Basics">Conceitos bsicos</h2> 56 57 <p>Um servio vinculado uma implementao da classe {@link android.app.Service} que permite 58 que outros aplicativos sejam vinculados e interajam com ele. Para fornecer a vinculao 59 a um servio, voc deve implementar o mtodo de retorno de chamada {@link android.app.Service#onBind onBind()}. Este mtodo 60 retorna um objeto {@link android.os.IBinder} que define a interface de programao 61 que os clientes podem usar para interagir com o servio.</p> 62 63 <div class="sidebox-wrapper"> 64 <div class="sidebox"> 65 <h3>Vinculao com um servio iniciado</h3> 66 67 <p>Como discutido na documentao <a href="{@docRoot}guide/components/services.html">Servios</a>, 68 possvel criar um servio que j foi iniciado e vinculado. Ou seja, o servio pode 69 ser iniciado chamando {@link android.content.Context#startService startService()}, que permite que ele 70 permanea em execuo indefinidamente e tambm permite que um cliente vincule-o chamando {@link 71 android.content.Context#bindService bindService()}. 72 <p>Se voc permitir que o servio seja iniciado e vinculado, ento, quando ele 73 for iniciado, o sistema <em>no</em> o destruir quando todos os clientes desfizerem a vnculo. Em vez disso, voc deve 74 interromper o servio explicitamente chamando {@link android.app.Service#stopSelf stopSelf()} ou {@link 75 android.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 necessrio implementar ambos. Por exemplo, um reprodutor de msica pode achar til permitir que o seu servio 80 permanea em execuo indefinidamente, alm de fornecer vinculao. Desta forma, uma atividade pode iniciar o servio 81 para reproduzir algumas msicas e a msica continuar em reproduo mesmo quando o usurio sair do aplicativo. Em seguida, quando o usurio 82 voltar ao aplicativo, a atividade poder vincular-se ao servio para retomar o controle da reproduo.</p> 83 84 <p>Certifique-se de ler a seo sobre <a href="#Lifecycle">Gerenciamento do ciclo de vida de um servio 85 vinculado</a> para obter mais informaes sobre o ciclo de vida do servio ao adicionar vinculao 86 a um servio iniciado.</p> 87 </div> 88 </div> 89 90 <p>Um cliente pode vincular-se ao servio chamando {@link android.content.Context#bindService 91 bindService()}. Quando isto ocorre, preciso fornecer uma implementao de {@link 92 android.content.ServiceConnection}, que monitora a conexo com o servio. O mtodo {@link 93 android.content.Context#bindService bindService()} retorna imediatamente sem um valor, 94 mas quando o sistema Android cria a conexo entre 95 o cliente e o servio, ele chama {@link 96 android.content.ServiceConnection#onServiceConnected onServiceConnected()} em {@link 97 android.content.ServiceConnection} para fornecer o {@link android.os.IBinder} 98 que o cliente pode usar para comunicar-se com o servio.</p> 99 100 <p>Vrios clientes podem conectar-se ao servio de uma vez. No entanto, o sistema chama o mtodo 101 {@link android.app.Service#onBind onBind()} do servio para recuperar o {@link android.os.IBinder} 102 somente quando o primeiro cliente vinculado. Em seguida, o sistema entrega o mesmo {@link android.os.IBinder} 103 para 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 servio, o sistema destruir o servio 106 (a no ser que ele tambm seja iniciado por {@link android.content.Context#startService startService()}).</p> 107 108 <p>Ao implementar o servio vinculado, o mais importante definir a interface 109 que o mtodo de retorno de chamada {@link android.app.Service#onBind onBind()} retornar. H poucas maneiras diferentes 110 de definir a interface {@link android.os.IBinder} do servio e a 111 seo a seguir discute cada tcnica.</p> 112 113 114 115 <h2 id="Creating">Criao de um servio vinculado</h2> 116 117 <p>Ao criar um servio que fornece vinculao, voc deve fornecer um {@link android.os.IBinder} 118 que oferea a interface de programao que os clientes podem usar para interagir com o servio. H trs maneiras 119 possveis de definir a interface:</p> 120 121 <dl> 122 <dt><a href="#Binder">Extenso da classe Binder</a></dt> 123 <dd>Se o servio for privado para o prprio 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} 125 e retornando uma instncia dela a partir de 126 {@link android.app.Service#onBind onBind()}. O cliente receber {@link android.os.Binder} 127 e poder us-lo para acessar os mtodos pblicos disponveis na implementao de {@link android.os.Binder} 128 ou at em {@link android.app.Service} diretamente. 129 <p>Esta a tcnica preferencial quando o servio meramente um trabalhador de segundo plano 130 para o aplicativo. O nico motivo pelo qual no se criaria a interface desta maneira 131 porque o servio 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, possvel 135 criar uma interface para o servio com {@link android.os.Messenger}. Desta maneira, o servio 136 define um {@link android.os.Handler} que responde a diferentes tipos de objetos {@link 137 android.os.Message}. Este {@link android.os.Handler} 138 a base para {@link android.os.Messenger}, que pode ento compartilhar um {@link android.os.IBinder} 139 com o cliente, permitindo que ele envie comandos ao servio usando objetos {@link 140 android.os.Message}. Alm disso, o cliente pode definir o prprio {@link android.os.Messenger} 141 para que o servio possa enviar as mensagens de volta. 142 <p>Esta a maneira mais simples de estabelecer comunicao entre processos (IPC), pois o {@link 143 android.os.Messenger} coloca todas as solicitaes em fila em um nico encadeamento para que voc no precise 144 projetar o servio 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 definio de interface do Android) realiza todo o trabalho de decomposio de objetos 149 em primitivos para que o sistema operacional possa entend-los e disp-los em processos 150 para realizar a IPC. A tcnica anterior, usando o {@link android.os.Messenger}, tem base em AIDL 151 como a estrutura fundamental. Como mencionado acima, o {@link android.os.Messenger} cria uma fila 152 de todas as solicitaes de cliente em um nico encadeamento para que o servio receba uma solicitao por vez. Se, no entanto, 153 voc quiser que o servio lide com vrias solicitaes simultaneamente, possvel usar a AIDL 154 diretamente. Neste caso, o servio dever ser capaz de realizar vrios encadeamentos e ser programado de forma segura para encadeamentos. 155 <p>Para usar a AIDL diretamente, deve-se 156 criar um arquivo {@code .aidl} que defina a interface de programao. As ferramentas SDK do Android 157 usam este arquivo para gerar uma classe abstrata que implemente a interface e lide com a IPC, 158 que pode ser estendida dentro do servio.</p> 159 </dd> 160 </dl> 161 162 <p class="note"><strong>Observao:</strong> a maioria dos aplicativos <strong>no deve</strong> usar a AIDL 163 para criar um servio vinculado, pois isto requer capacidade de se trabalhar com encadeamentos mltiplos 164 e pode resultar em uma implementao mais complicada. Portanto, a AIDL no adequada para a maioria dos aplicativos 165 e este documento no discute o seu uso para o servio. Caso tenha certeza de que 166 precisa usar a AIDL diretamente, consulte a documentao 167 <a href="{@docRoot}guide/components/aidl.html">AIDL</a>.</p> 168 169 170 171 172 <h3 id="Binder">Extenso da classe Binder</h3> 173 174 <p>Se o servio for usado somente pelo aplicativo local e no precisar trabalhar entre processos, 175 ento ser possvel implementar a prpria classe {@link android.os.Binder} que fornece ao cliente 176 acesso direto aos mtodos pblicos no servio.</p> 177 178 <p class="note"><strong>Observao:</strong> isto funciona somente se o cliente e o servio 179 estiverem no mesmo aplicativo e processo, o que muito comum. Por exemplo, isto funcionaria bem para um 180 aplicativo de msica que precise vincular uma atividade ao prprio servio que est 181 reproduzindo msica em segundo plano.</p> 182 183 <p>Como configurar:</p> 184 <ol> 185 <li>No servio, crie uma instncia de {@link android.os.Binder} que: 186 <ul> 187 <li>contenha mtodos pblicos que o cliente possa chamar</li> 188 <li>retorne ao cliente a instncia {@link android.app.Service}, que tenha mtodos pblicos 189 que ele possa chamar</li> 190 <li>ou retorne uma instncia de outra classe hospedada pelo servio com mtodos pblicos 191 que o cliente possa chamar</li> 192 </ul> 193 <li>Retorne esta instncia de {@link android.os.Binder} a partir do mtodo de retorno de chamada {@link 194 android.app.Service#onBind onBind()}.</li> 195 <li>No cliente, receba o {@link android.os.Binder} a partir do mtodo de retorno de chamada {@link 196 android.content.ServiceConnection#onServiceConnected onServiceConnected()} 197 e faa chamadas para o servios vinculados usando os mtodos fornecidos.</li> 198 </ol> 199 200 <p class="note"><strong>Observao:</strong> o motivo pelo qual o servio e o cliente devem estar no mesmo aplicativo 201 para que o cliente possa lanar o objeto retornado e chamar as APIs adequadamente. O servio e o cliente 202 tambm devem estar no mesmo processo, pois esta tcnica no possui 203 nenhuma ingerncia entre processos.</p> 204 205 <p>Por exemplo, a seguir h um servio que fornece aos clientes acesso aos mtodos no servio 206 por meio de uma implementao de {@link android.os.Binder}:</p> 207 208 <pre> 209 public 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 mtodo {@code getService()} para que os clientes 239 recuperem a instncia atual de {@code LocalService}. Isto permite que os clientes chamem mtodos pblicos 240 no servio. Por exemplo, eles podem chamar {@code getRandomNumber()} a partir do servio.</p> 241 242 <p>Abaixo h uma atividade que vincula-se a {@code LocalService} e chama {@code getRandomNumber()} 243 quando um boto pressionado:</p> 244 245 <pre> 246 public 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 servio usando uma implementao 307 de {@link android.content.ServiceConnection} e o retorno de chamada {@link 308 android.content.ServiceConnection#onServiceConnected onServiceConnected()}. A prxima seo 309 fornece mais informaes sobre este processo de vinculao ao servio.</p> 310 311 <p class="note"><strong>Observao:</strong> o exemplo acima no desfaz a vinculao explicitamente a partir do servio, 312 mas todos os clientes devem faz-lo no momento adequado (como quando a atividade pausa).</p> 313 314 <p>Para obter mais cdigos de exemplo, consulte a classe <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code 315 LocalService.java}</a> e a classe <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalServiceActivities.html">{@code 316 LocalServiceActivities.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 necessrio 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 329 todas as chamadas do servio, enquanto que uma interface de AIDL pura envia solicitaes simultneas 330 ao servio, que deve ento lidar com vrios encadeamentos.</p> 331 <p>Para a maioria dos aplicativos, o servio no precisa realizar vrios encadeamentos. Portanto, usar {@link 332 android.os.Messenger} permite que o servio lide com uma chamada por vez. Caso seja importante 333 que o servio realize vrios 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 servio comunique-se com processos remotos, possvel usar 338 o {@link android.os.Messenger} para fornecer a interface ao servio. Esta tcnica permite 339 estabelecer comunicao 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 servio implementa um {@link android.os.Handler} que recebe um retorno de chamada 345 para 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 referncia para o {@link android.os.Handler}).</li> 348 <li>O {@link android.os.Messenger} cria um {@link android.os.IBinder} que o servio 349 retorna 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 servio), que usam para enviar objetos 352 {@link android.os.Message} para o servio.</li> 353 <li>O servio recebe cada {@link android.os.Message} em seu {@link 354 android.os.Handler} — especificamente, no mtodo {@link android.os.Handler#handleMessage 355 handleMessage()}.</li> 356 </ul> 357 358 359 <p>Desta forma, no h "mtodos" para o cliente chamar no servio. Em vez disso, o cliente 360 envia "mensagens" (objetos {@link android.os.Message}) que o servio recebe 361 no {@link android.os.Handler}.</p> 362 363 <p>Abaixo h um exemplo simples de servio que usa uma interface {@link android.os.Messenger}:</p> 364 365 <pre> 366 public 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 mtodo {@link android.os.Handler#handleMessage handleMessage()} 404 no {@link android.os.Handler} onde o servio recebe a {@link android.os.Message} 405 e 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 408 android.os.IBinder} retornado pelo servio e enviar uma mensagem usando {@link 409 android.os.Messenger#send send()}. Por exemplo, a seguir h uma atividade simples que vincula-se 410 ao servio e envia a mensagem {@code MSG_SAY_HELLO} a ele:</p> 411 412 <pre> 413 public 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 no mostra como o servio pode responder ao cliente. Caso queira que o servio responda, 480 necessrio criar um {@link android.os.Messenger} no cliente tambm. Em seguida, 481 quando o cliente receber o retorno de chamada de {@link android.content.ServiceConnection#onServiceConnected 482 onServiceConnected()}, ele enviar uma {@link android.os.Message} para o servio que inclui 483 o {@link android.os.Messenger} no parmetro {@link android.os.Message#replyTo} 484 do mtodo {@link android.os.Messenger#send send()}.</p> 485 486 <p> possvel 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 487 MessengerService.java}</a> (servio) e <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/MessengerServiceActivities.html">{@code 488 MessengerServiceActivities.java}</a> (cliente).</p> 489 490 491 492 493 494 <h2 id="Binding">Vinculao a um servio</h2> 495 496 <p>Um componente de aplicativo (cliente) pode vincular-se a um servio chamando 497 {@link android.content.Context#bindService bindService()}. O sistema Android, em seguida, 498 chama o mtodo {@link android.app.Service#onBind 499 onBind()} do servio, que retorna um {@link android.os.IBinder} para interagir com o servio.</p> 500 501 <p>A vinculao assncrona. {@link android.content.Context#bindService 502 bindService()} retorna imediatamente e <em>no</em> retorna o {@link android.os.IBinder} 503 ao cliente. Para receber {@link android.os.IBinder}, o cliente deve criar uma instncia de {@link 504 android.content.ServiceConnection} e pass-la para {@link android.content.Context#bindService 505 bindService()}. O {@link android.content.ServiceConnection} inclui um mtodo de retorno de chamada 506 que o sistema chama para entregar o {@link android.os.IBinder}.</p> 507 508 <p class="note"><strong>Observao:</strong> somente atividades, servios e provedores de contedo 509 podem vincular-se a um servio — voc <strong>no</strong> pode fazer isto a partir de um receptor de transmisso.</p> 510 511 <p>Portanto, para vincular-se a um servio a partir do cliente, deve-se: </p> 512 <ol> 513 <li>Implementar {@link android.content.ServiceConnection}. 514 <p>Sua implementao deve substituir dois mtodos 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 518 pelo mtodo {@link android.app.Service#onBind onBind()} do servio.</dd> 519 <dt>{@link android.content.ServiceConnection#onServiceDisconnected 520 onServiceDisconnected()}</dt> 521 <dd>O sistema Android chama isto quando a conexo ao servio perdida inesperadamente, 522 como quando o servio apresenta problemas ou fechado repentinamente. Isto <em>no</em> chamado quando 523 o cliente desfaz o vnculo.</dd> 524 </dl> 525 </li> 526 <li>Chamar {@link 527 android.content.Context#bindService bindService()}, passando a implementao {@link 528 android.content.ServiceConnection}. </li> 529 <li>Quando o sistema chamar o mtodo de retorno de chamada {@link android.content.ServiceConnection#onServiceConnected 530 onServiceConnected()}, possvel fazer chamadas para o servio 531 usando os mtodos definidos pela interface.</li> 532 <li>Para desconectar-se de um servio, chamar {@link 533 android.content.Context#unbindService unbindService()}. 534 <p>Quando um cliente destrudo, o vnculo com o servio acaba. No entanto, sempre desvincule-se 535 ao terminar a interao com o servio ou quando a atividade pausar para que o servio 536 possa ser encerrado enquanto no estiver em uso (os momentos adequados para vincular ou desvincular 537 so abordados mais abaixo).</p> 538 </li> 539 </ol> 540 541 <p>Por exemplo, o fragmento a seguir conecta o cliente ao servio criado acima 542 <a href="#Binder">estendendo a classe Binder</a> para que tudo que ele tenha que fazer seja lanar 543 o {@link android.os.IBinder} retornado para a classe {@code LocalService} e solicitar a instncia de {@code 544 LocalService}:</p> 545 546 <pre> 547 LocalService mService; 548 private 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 servio 568 passando-o para {@link android.content.Context#bindService bindService()}. Por exemplo:</p> 569 570 <pre> 571 Intent intent = new Intent(this, LocalService.class); 572 bindService(intent, mConnection, Context.BIND_AUTO_CREATE); 573 </pre> 574 575 <ul> 576 <li>O primeiro parmetro de {@link android.content.Context#bindService bindService()} 577 uma {@link android.content.Intent} que nomeia explicitamente o servio que ser vinculado (apesar de a inteno 578 poder ser implcita).</li> 579 <li>O segundo parmetro o objeto {@link android.content.ServiceConnection}.</li> 580 <li>O terceiro parmetro um sinalizador que indica as opes de vinculao. Geralmente, ele deve ser {@link 581 android.content.Context#BIND_AUTO_CREATE} para criar o servio se no estiver ativo ainda. 582 Outros possveis valores so {@link android.content.Context#BIND_DEBUG_UNBIND} 583 e {@link android.content.Context#BIND_NOT_FOREGROUND}, ou {@code 0} para nada.</li> 584 </ul> 585 586 587 <h3>Observaes adicionais</h3> 588 589 <p>A seguir h algumas observaes importantes sobre a vinculao com um servio:</p> 590 <ul> 591 <li>Deve-se sempre capturar excees{@link android.os.DeadObjectException}, que so lanadas 592 quando a conexo apresenta erros. Esta a nica exceo lanada por mtodos remotos.</li> 593 <li>Objetos so referncias contadas em todos os processos. </li> 594 <li>Geralmente, alterna-se entre a vinculao e a desvinculao 595 durante os momentos crescentes e decrescentes do ciclo de vida do cliente. Por exemplo: 596 <ul> 597 <li>Caso precise interagir com o servio enquanto a atividade estiver visvel, 598 deve-se vincular durante {@link android.app.Activity#onStart onStart()} e desvincular durante {@link 599 android.app.Activity#onStop onStop()}.</li> 600 <li>Caso queira que a atividade receba mensagens mesmo quando for interrompida 601 em segundo plano, possvel vincular durante {@link android.app.Activity#onCreate onCreate()} 602 e desvincular durante {@link android.app.Activity#onDestroy onDestroy()}. Cuidado, pois isto significa que a atividade 603 precisa usar o servio durante todo o tempo de execuo (mesmo em segundo plano). 604 Portanto, se o servio estiver em outro processo, o peso do processo ser aumentado 605 e mais provvel que o sistema elimine-o.</li> 606 </ul> 607 <p class="note"><strong>Observao:</strong> geralmente, <strong>no</strong> se realiza o vnculo e o seu rompimento 608 durante o {@link android.app.Activity#onResume onResume()} e o {@link 609 android.app.Activity#onPause onPause()} da atividade, pois esses retornos de chamada ocorrem em todas as transies do ciclo de vida 610 e deve-se usar menos processamento possvel nessas transaes. Alm disso, 611 se vrias atividades no aplicativo vincularem-se ao mesmo servio e houver uma transao entre duas 612 dessas atividades, o servio poder ser destrudo e recriado medida que a atividade desvincula-se, 613 durante a pausa, antes do prximo vnculo, durante a retomada (esta transio de atividade 614 para 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 cdigos de exemplomostrando como vincular a um servio, consulte a classe <a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/RemoteService.html">{@code 619 RemoteService.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 servio vinculado</h2> 626 627 <p>Quando um servio desvinculado de todos os clientes, o sistema Android o destri (a no ser que ele 628 tambm tenha sido inicializado com {@link android.app.Service#onStartCommand onStartCommand()}). Portanto, no necessrio 629 gerenciar o ciclo de vida do servio se ele for puramente um servio vinculado 630 — o sistema Android o gerencia com base nos vnculos com os clientes.</p> 631 632 <p>No entanto, se voc escolher implementar o mtodo de retorno de chamada {@link android.app.Service#onStartCommand 633 onStartCommand()}, interrompa o servio explicitamente, pois o servio 634 j ter sido considerado como <em>iniciado</em>. Neste caso, o servio permanece em execuo at 635 ser interrompido com {@link android.app.Service#stopSelf()} ou outras chamadas de componente {@link 636 android.content.Context#stopService stopService()}, independente de vnculo 637 com qualquer cliente.</p> 638 639 <p>Alm disso, se o servio for iniciado e aceitar vnculos, quando o sistema chamar 640 o mtodo {@link android.app.Service#onUnbind onUnbind()}, ser possvel retornar 641 {@code true} opcionalmente se voc quiser receber uma chamada de {@link android.app.Service#onRebind 642 onRebind()} na prxima vez em que um cliente vincular-se ao servio (em vez de receber uma chamada de {@link 643 android.app.Service#onBind onBind()}). {@link android.app.Service#onRebind 644 onRebind()} retorna vazio, mas o cliente ainda recebe {@link android.os.IBinder} 645 no retorno de chamada {@link android.content.ServiceConnection#onServiceConnected onServiceConnected()}. 646 Abaixo, a figura 1 ilustra a lgica 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 servio que iniciado 651 e tambm permite vnculos.</p> 652 653 654 <p>Para obter mais informaes sobre o ciclo de vida de um servio iniciado, consulte o documento <a href="{@docRoot}guide/components/services.html#Lifecycle">Servios</a>.</p> 655 656 657 658 659