Home | History | Annotate | Download | only in components
      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     &#64;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     &#64;Override
    251     protected void onCreate(Bundle savedInstanceState) {
    252         super.onCreate(savedInstanceState);
    253         setContentView(R.layout.main);
    254     }
    255 
    256     &#64;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     &#64;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         &#64;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         &#64;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} &mdash; 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         &#64;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     &#64;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     &#64;Override
    454     protected void onCreate(Bundle savedInstanceState) {
    455         super.onCreate(savedInstanceState);
    456         setContentView(R.layout.main);
    457     }
    458 
    459     &#64;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     &#64;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 &mdash; 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 &mdash; 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