Home | History | Annotate | Download | only in components
      1 page.title=Servios
      2 @jd:body
      3 
      4 <div id="qv-wrapper">
      5 <ol id="qv">
      6 <h2>Neste documento</h2>
      7 <ol>
      8 <li><a href="#Basics">Conceitos bsicos</a></li>
      9 <ol>
     10   <li><a href="#Declaring">Declarao de servio no manifesto</a></li>
     11 </ol>
     12 <li><a href="#CreatingAService">Criao de servio iniciado</a>
     13   <ol>
     14     <li><a href="#ExtendingIntentService">Extenso da classe IntentService</a></li>
     15     <li><a href="#ExtendingService">Extenso da classe Service</a></li>
     16     <li><a href="#StartingAService">Incio de servio</a></li>
     17     <li><a href="#Stopping">Interrupo de servio</a></li>
     18   </ol>
     19 </li>
     20 <li><a href="#CreatingBoundService">Criao de servio vinculado</a></li>
     21 <li><a href="#Notifications">Envio de notificaes ao usurio</a></li>
     22 <li><a href="#Foreground">Execuo de servio em primeiro plano</a></li>
     23 <li><a href="#Lifecycle">Gerenciamento do ciclo de vida de um servio</a>
     24 <ol>
     25   <li><a href="#LifecycleCallbacks">Implementao dos retornos de chamada do ciclo de vida</a></li>
     26 </ol>
     27 </li>
     28 </ol>
     29 
     30 <h2>Classes principais</h2>
     31 <ol>
     32   <li>{@link android.app.Service}</li>
     33   <li>{@link android.app.IntentService}</li>
     34 </ol>
     35 
     36 <h2>Exemplos</h2>
     37 <ol>
     38   <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/ServiceStartArguments.html">{@code
     39       ServiceStartArguments}</a></li>
     40   <li><a href="{@docRoot}resources/samples/ApiDemos/src/com/example/android/apis/app/LocalService.html">{@code
     41       LocalService}</a></li>
     42 </ol>
     43 
     44 <h2>Veja tambm</h2>
     45 <ol>
     46 <li><a href="{@docRoot}guide/components/bound-services.html">Servios vinculados</a></li>
     47 </ol>
     48 
     49 </div>
     50 
     51 
     52 <p>Um {@link android.app.Service}  um componente do aplicativo que pode realizar
     53 operaes longas e no fornece uma interface do usurio. Outro componente do aplicativo
     54 pode iniciar um servio e ele continuar em execuo em segundo plano mesmo que o usurio
     55 alterne para outro aplicativo. Alm disso, um componente poder vincular-se a um servio
     56 para interagir com ele e at estabelecer comunicao entre processos (IPC). Por exemplo, um servio pode lidar
     57 com operaes de rede, reproduzir msica, executar E/S de arquivos, ou interagir com um provedor de contedo,
     58 tudo a partir do segundo plano.</p>
     59 
     60 <p>Um servio pode essencialmente ter duas formas:</p>
     61 
     62 <dl>
     63   <dt>Iniciado</dt>
     64   <dd>Um servio  "iniciado" quando um componente do aplicativo (como um atividade)
     65 inicia-o chamando {@link android.content.Context#startService startService()}. Quando iniciado, um servio
     66 pode ficar em execuo em segundo plano indefinidamente, mesmo que o componente que o iniciou seja destrudo. Geralmente,
     67 um servio iniciado realiza uma nica operao e no retorna um resultado para o autor da chamada.
     68 Por exemplo, ele pode fazer download ou upload de um arquivo pela rede. Quando a operao for concluda,
     69 o servio dever ser interrompido.</dd>
     70   <dt>Vinculado</dt>
     71   <dd>Um servio  "vinculado" quando um componente do aplicativo o vincula chamando {@link
     72 android.content.Context#bindService bindService()}. Um servio vinculado oferece uma interface
     73 servidor-cliente que permite que os componentes interajam com a interface, enviem solicitaes, obtenham resultados,
     74 mesmo em processos com comunicao interprocessual (IPC). Um servio vinculado permanece em execuo somente enquanto
     75 outro componente do aplicativo estiver vinculado a ele. Vrios componentes podem ser vinculados ao servio de uma s vez,
     76 mas quando todos desfizerem o vnculo, o servio ser destrudo.</dd>
     77 </dl>
     78 
     79 <p>Apesar de esta documentao discutir os dois tipos de servios separadamente,
     80 um servio pode funcionar das duas maneiras &mdash; ele pode ser iniciado (para permanecer em execuo indefinidamente) e tambm permitir a vinculao.
     81 Basta voc implementar alguns mtodos de retorno de chamada: {@link
     82 android.app.Service#onStartCommand onStartCommand()} para permitir que os componentes iniciem o servio e {@link
     83 android.app.Service#onBind onBind()} para permitir a vinculao.</p>
     84 
     85 <p>Se o aplicativo for iniciado, vinculado ou ambos, qualquer componente do aplicativo
     86 poder usar o servio (mesmo a partir de um aplicativo separado), da mesma forma que qualquer componente poder usar
     87 uma atividade &mdash; iniciando com uma {@link android.content.Intent}. No entanto,  possvel declarar
     88 o servio como privado, no arquivo do manifesto, e bloquear o acesso de outros aplicativos. Isto  discutido com mais detalhes
     89 na seo <a href="#Declaring">Declarao do servio
     90 no manifesto</a>.</p>
     91 
     92 <p class="caution"><strong>Ateno:</strong> um servio  executado
     93 no encadeamento principal em seu processo de hospedagem &mdash; o servio <strong>no</strong> cria seu prprio encadeamento
     94 e <strong>no</strong>  executado em um processo separado (salvo se especificado). Isso significa que,
     95  se o servio for realizar qualquer trabalho intensivo de CPU ou operaes de bloqueio (como reproduo
     96 de MP3 ou rede), voc deve criar um novo encadeamento dentro do servio. Usando um encadeamento separado,
     97 voc reduzir o risco da ocorrncia de erros de Aplicativo no respondendo (ANR)
     98 e o encadeamento principal do aplicativo poder permanecer dedicado  interao do usurio com as atividades.</p>
     99 
    100 
    101 <h2 id="Basics">Conceitos bsicos</h2>
    102 
    103 <div class="sidebox-wrapper">
    104 <div class="sidebox">
    105   <h3>Voc deve usar um servio ou um encadeamento?</h3>
    106   <p>Um servio  simplesmente um componente que pode ser executado em segundo plano mesmo quando o usurio
    107 no est interagindo com o aplicativo. Portanto, um servio deve ser criado somente
    108 se for realmente necessrio.</p>
    109   <p>Caso precise realizar trabalhos fora do encadeamento principal, mas somente enquanto o usurio estiver interagindo
    110 com o aplicativo, ento voc deve criar um novo encadeamento e no um servio. Por exemplo,
    111 se quiser reproduzir msicas, mas somente enquanto a atividade estiver em execuo, voc pode criar um encadeamento
    112 em {@link android.app.Activity#onCreate onCreate()}, iniciando a execuo em {@link
    113 android.app.Activity#onStart onStart()}, e interrompendo em {@link android.app.Activity#onStop
    114 onStop()}. Considere tambm usar {@link android.os.AsyncTask} ou {@link android.os.HandlerThread},
    115 em vez de a classe tradicional {@link java.lang.Thread}. Consulte o documento <a href="{@docRoot}guide/components/processes-and-threads.html#Threads">Processos e
    116 encadeamentos</a> para obter mais informaes sobre encadeamentos.</p>
    117   <p>Lembre-se de que, se usar um servio, ele ainda ser executado no encadeamento principal do aplicativo por padro,
    118 portanto deve-se criar um novo encadeamento dentro do servio se ele realizar operaes
    119 intensivas ou de bloqueio.</p>
    120 </div>
    121 </div>
    122 
    123 <p>Para criar um servio, voc deve criar uma subclasse de {@link android.app.Service}
    124 (ou uma das subclasses existentes). Na implementao, ser necessrio substituir alguns mtodos de retorno de chamada
    125 que lidem com aspectos essenciais do ciclo de vida do servio e forneam um mecanismo para vincular
    126 componentes ao servio, se apropriado. Os dois mtodos mais importantes de retorno de chamada que voc deve substituir so:</p>
    127 
    128 <dl>
    129   <dt>{@link android.app.Service#onStartCommand onStartCommand()}</dt>
    130     <dd>O sistema chama este mtodo quando outro componente, como uma atividade,
    131 solicita que o servio seja iniciado, chamando {@link android.content.Context#startService
    132 startService()}. Quando este mtodo  executado, o servio  iniciado e pode ser executado
    133 em segundo plano indefinidamente. Se implementar isto,  de sua responsabilidade interromper o servio
    134 quando o trabalho for concludo, chamando {@link android.app.Service#stopSelf stopSelf()} ou {@link
    135 android.content.Context#stopService stopService()} (caso queira somente fornecer a vinculao,
    136 no  necessrio implementar este mtodo).</dd>
    137   <dt>{@link android.app.Service#onBind onBind()}</dt>
    138     <dd>O sistema chama este mtodo quando outro componente quer vincular-se
    139 ao servio (como para realizaes de RPC) chamando {@link android.content.Context#bindService
    140 bindService()}. Na implementao deste mtodo, voc deve fornecer uma interface que os clientes
    141 usem para comunicar-se com o servio, retornando um {@link android.os.IBinder}. Voc sempre deve implementar este mtodo,
    142 mas, se no quiser permitir a vinculao, retorne nulo.</dd>
    143   <dt>{@link android.app.Service#onCreate()}</dt>
    144     <dd>O sistema chama este mtodo quando o servio  criado pela primeira vez para realizar procedimentos nicos
    145 de configurao (antes de chamar {@link android.app.Service#onStartCommand onStartCommand()} ou
    146 {@link android.app.Service#onBind onBind()}). Se o servio j estiver em execuo, este mtodo
    147 no  chamado.</dd>
    148   <dt>{@link android.app.Service#onDestroy()}</dt>
    149     <dd>O sistema chama este mtodo quando o servio no  mais usado e est sendo destrudo.
    150 O servio deve implementar isto para limpar quaisquer recursos, como encadeamentos, escutas
    151 registradas, receptores etc. Esta  a ltima chamada que o servio recebe.</dd>
    152 </dl>
    153 
    154 <p>Se um componente iniciar o servio chamando {@link
    155 android.content.Context#startService startService()} (o que resulta em uma chamada para {@link
    156 android.app.Service#onStartCommand onStartCommand()}),
    157 o servio permanecer em execuo at ser interrompido por conta prpria com {@link android.app.Service#stopSelf()} ou por outro componente
    158 chamando {@link android.content.Context#stopService stopService()}.</p>
    159 
    160 <p>Se um componente
    161 chamar {@link android.content.Context#bindService bindService()} para criar o servio (e {@link
    162 android.app.Service#onStartCommand onStartCommand()} <em>no</em> for chamado), o servio ser executado
    163 somente enquanto o componente estiver vinculado a ele. Quando o servio for desvinculado de todos os clientes,
    164 o sistema o destruir.</p>
    165 
    166 <p>O sistema Android forar a interrupo de um servio somente quando a memria estiver baixa e precisar
    167 recuperar os recursos do sistema para a atividade com que o usurio estiver interagindo. Se o servio estiver vinculado a uma atividade que o usurio
    168 tenha atribudo foco,  menos provvel que ele seja eliminado. E, se o servio for declarado para <a href="#Foreground">ser executado em primeiro plano</a> (discutido posteriormente), ento ele quase nunca ser eliminado.
    169 Caso contrrio, se o servio for iniciado e estiver em uma longa execuo, o sistema reduzir sua posio
    170 na lista de tarefas de segundo plano no decorrer do tempo e o servio se tornar altamente suscetvel
    171  eliminao &mdash; se o servio for iniciado, ento voc deve program-lo para lidar
    172 com reinicializaes pelo sistema. Se o sistema eliminar o seu servio, ele reiniciar assim que os recursos
    173 estiverem disponveis novamente (apesar de isto tambm depender do valor que voc retornar de {@link
    174 android.app.Service#onStartCommand onStartCommand()}, como discutido a seguir). Para obter mais informaes sobre
    175 quando o sistema deve destruir um servio, consulte o documento <a href="{@docRoot}guide/components/processes-and-threads.html">Processos e encadeamentos</a>
    176 .</p>
    177 
    178 <p>Nas seguintes sees, voc ver como  possvel criar cada tipo de servio e como
    179 us-los a partir de outros componentes do aplicativo.</p>
    180 
    181 
    182 
    183 <h3 id="Declaring">Declarao de servio no manifesto</h3>
    184 
    185 <p>Como atividades (e outros componentes), voc deve declarar todos os servios no arquivo de manifesto
    186 do aplicativo.</p>
    187 
    188 <p>Para declarar o servio, adicione um elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a>
    189 como filho do elemento <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>
    190 . Por exemplo:</p>
    191 
    192 <pre>
    193 &lt;manifest ... &gt;
    194   ...
    195   &lt;application ... &gt;
    196       &lt;service android:name=".ExampleService" /&gt;
    197       ...
    198   &lt;/application&gt;
    199 &lt;/manifest&gt;
    200 </pre>
    201 
    202 <p>Consulte a referncia de elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a>
    203 para obter mais informaes sobre como declarar o servio no manifesto.</p>
    204 
    205 <p> possvel incluir outros atributos no elemento <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code &lt;service&gt;}</a>
    206 para definir propriedades como permisses necessrias para iniciar o servio e o processo
    207 em que o servio deve ser executado. O atributo <a href="{@docRoot}guide/topics/manifest/service-element.html#nm">{@code android:name}</a>
    208  o nico necessrio &mdash; ele especifica o nome da classe do servio. Ao publicar o aplicativo,
    209  no deve-se alterar-lhe o nome porque, se isso acontecer, h riscos de ocorrncia de erros
    210 de cdigo devido  dependncia de intenes explcitas para iniciar ou vincular o servio (leia a publicao do blogue, <a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Coisas
    211 que no podem mudar</a>).
    212 
    213 <p>Para garantir a segurana do aplicativo, <strong>sempre use uma inteno explcita ao iniciar ou vincular
    214 {@link android.app.Service}</strong> e no declare filtros de inteno para o servio. Caso seja essencial permitir alguma ambiguidade, como qual servio deve ser usado para iniciar,
    215  possvel fornecer filtros de intenes
    216 para os servios e excluir o nome do componente de {@link
    217 android.content.Intent}, mas  preciso definir o pacote para a inteno com {@link
    218 android.content.Intent#setPackage setPackage()}, que fornece desambiguidade suficiente para
    219 o servio alvo.</p>
    220 
    221 <p>Alm disso,  possvel garantir que o servio esteja disponvel somente para o aplicativo
    222 incluindo o atributo <a href="{@docRoot}guide/topics/manifest/service-element.html#exported">{@code android:exported}</a>
    223 e definindo-o como {@code "false"}. Isto impede efetivamente que outros aplicativos iniciem o servio,
    224  mesmo usando uma inteno explcita.</p>
    225 
    226 
    227 
    228 
    229 <h2 id="CreatingStartedService">Criao de um servio iniciado</h2>
    230 
    231 <p>Um servio iniciado  o que outro componente inicia chamando {@link
    232 android.content.Context#startService startService()}, resultando em uma chamada para o mtodo
    233 {@link android.app.Service#onStartCommand onStartCommand()} do servio.</p>
    234 
    235 <p>Quando um servio  iniciado, ele tem um ciclo de vida que no depende do componente
    236 que o iniciou. Alm disso, o servio pode ser executado em segundo plano indefinidamente,
    237 mesmo se o componente que o iniciou for eliminado. Alm disso, o servio deve ser interrompido quando o seu trabalho
    238 for realizado, chamando {@link android.app.Service#stopSelf stopSelf()}. Outros componentes podem interromp-lo
    239 chamando {@link android.content.Context#stopService stopService()}.</p>
    240 
    241 <p>Um componente do aplicativo, como uma atividade, pode iniciar o servio chamando {@link
    242 android.content.Context#startService startService()} e passando {@link android.content.Intent},
    243 que especifica o servio e inclui os dados para o servio usar. O servio
    244 recebe esta {@link android.content.Intent} no mtodo {@link android.app.Service#onStartCommand
    245 onStartCommand()}.</p>
    246 
    247 <p>Por exemplo, presuma que uma atividade precise salvar alguns dados em um banco de dados on-line. A atividade pode iniciar
    248 um servio de acompanhamento e entregar a ele os dados a salvar passando uma inteno para {@link
    249 android.content.Context#startService startService()}. O servio recebe a inteno em {@link
    250 android.app.Service#onStartCommand onStartCommand()}, conecta-se  Internet e realiza
    251 a transao no banco de dados. Quando a operao  concluda, o servio  interrompido
    252 e destrudo.</p>
    253 
    254 <p class="caution"><strong>Ateno:</strong> um servio  executado no mesmo processo que o aplicativo
    255 em que ele  declarado e no encadeamento principal do aplicativo, por padro. Portanto, se o servio
    256 realizar operaes intensivas ou de bloqueio quando o usurio interagir com uma atividade do mesmo aplicativo,
    257 diminuir o desempenho da atividade. Para evitar impacto no desempenho do aplicativo,
    258 deve-se iniciar um novo encadeamento dentro do servio.</p>
    259 
    260 <p>Geralmente, h duas classes que podem ser estendidas para criar um servio iniciado:</p>
    261 <dl>
    262   <dt>{@link android.app.Service}</dt>
    263   <dd>Esta  a classe de base para todos os servios. Ao estender esta classe,  importante
    264 criar um novo encadeamento para fazer todo o trabalho do servio, pois o servio usa
    265 o encadeamento principal do aplicativo, por padro, o que deve diminuir o desempenho de qualquer atividade
    266 que o aplicativo estiver executando.</dd>
    267   <dt>{@link android.app.IntentService}</dt>
    268   <dd>Esta  uma subclasse de {@link android.app.Service} que usa um encadeamento de trabalho para lidar
    269 com todas as solicitaes de inicializao, uma por vez. Esta  a melhor opo se no quiser que o servio
    270 lide com vrias solicitaes simultaneamente. Tudo que precisa fazer  implementar {@link
    271 android.app.IntentService#onHandleIntent onHandleIntent()}, que recebe a inteno para cada solicitao
    272 de incio para que voc possa realizar o trabalho de segundo plano.</dd>
    273 </dl>
    274 
    275 <p>As seguintes sees descrevem como  possvel implementar o servio usando
    276 uma dessas classes.</p>
    277 
    278 
    279 <h3 id="ExtendingIntentService">Extenso da classe IntentService</h3>
    280 
    281 <p>Como a maioria dos servios no precisam lidar com vrias solicitaes simultaneamente
    282 (o que pode ser perigoso para situaes de vrios encadeamentos),  melhor
    283 se o servio for implementado usando a classe {@link android.app.IntentService}.</p>
    284 
    285 <p>O {@link android.app.IntentService} faz o seguinte:</p>
    286 
    287 <ul>
    288   <li>Cria um encadeamento de trabalho padro que executa todas as intenes entregues a {@link
    289 android.app.Service#onStartCommand onStartCommand()} separado do encadeamento principal
    290 do aplicativo.</li>
    291   <li>Cria uma fila de trabalho que passa uma inteno por vez  implementao {@link
    292 android.app.IntentService#onHandleIntent onHandleIntent()}, para que nunca seja necessrio
    293 preocupar-se com vrios encadeamentos.</li>
    294   <li>Interrompe o servio depois que todas as solicitaes forem resolvidas para que no seja necessrio chamar
    295 {@link android.app.Service#stopSelf}.</li>
    296   <li>Fornece implementaes padro de {@link android.app.IntentService#onBind onBind()}
    297 que retornam como nulo.</li>
    298   <li>Fornece uma implementao padro de {@link android.app.IntentService#onStartCommand
    299 onStartCommand()} que envia a inteno para a fila de trabalho e, em seguida, para a implementao de {@link
    300 android.app.IntentService#onHandleIntent onHandleIntent()}.</li>
    301 </ul>
    302 
    303 <p>Tudo isso adiciona-se ao fato de que basta implementar {@link
    304 android.app.IntentService#onHandleIntent onHandleIntent()} para fazer o trabalho fornecido
    305 pelo cliente (embora tambm seja necessrio fornecer um pequeno construtor para o servio).</p>
    306 
    307 <p>A seguir h um exemplo de implementao de {@link android.app.IntentService}:</p>
    308 
    309 <pre>
    310 public class HelloIntentService extends IntentService {
    311 
    312   /**
    313    * A constructor is required, and must call the super {@link android.app.IntentService#IntentService}
    314    * constructor with a name for the worker thread.
    315    */
    316   public HelloIntentService() {
    317       super("HelloIntentService");
    318   }
    319 
    320   /**
    321    * The IntentService calls this method from the default worker thread with
    322    * the intent that started the service. When this method returns, IntentService
    323    * stops the service, as appropriate.
    324    */
    325   &#64;Override
    326   protected void onHandleIntent(Intent intent) {
    327       // Normally we would do some work here, like download a file.
    328       // For our sample, we just sleep for 5 seconds.
    329       long endTime = System.currentTimeMillis() + 5*1000;
    330       while (System.currentTimeMillis() &lt; endTime) {
    331           synchronized (this) {
    332               try {
    333                   wait(endTime - System.currentTimeMillis());
    334               } catch (Exception e) {
    335               }
    336           }
    337       }
    338   }
    339 }
    340 </pre>
    341 
    342 <p> tudo que voc precisa: um construtor e uma implementao de {@link
    343 android.app.IntentService#onHandleIntent onHandleIntent()}.</p>
    344 
    345 <p>Caso decida substituir outros mtodos de retorno de chamada, como {@link
    346 android.app.IntentService#onCreate onCreate()}, {@link
    347 android.app.IntentService#onStartCommand onStartCommand()} ou {@link
    348 android.app.IntentService#onDestroy onDestroy()}, certifique-se de chamar a super-implementao
    349 para que o {@link android.app.IntentService} possa lidar adequadamente com a vida do encadeamento de trabalho.</p>
    350 
    351 <p>Por exemplo, {@link android.app.IntentService#onStartCommand onStartCommand()} deve retornar
    352 a implementao padro (que  como a inteno  entregue para {@link
    353 android.app.IntentService#onHandleIntent onHandleIntent()}):</p>
    354 
    355 <pre>
    356 &#64;Override
    357 public int onStartCommand(Intent intent, int flags, int startId) {
    358     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    359     return super.onStartCommand(intent,flags,startId);
    360 }
    361 </pre>
    362 
    363 <p>Alm de {@link android.app.IntentService#onHandleIntent onHandleIntent()}, o nico mtodo
    364 que no precisa ser usado para chamar a superclasse  {@link android.app.IntentService#onBind
    365 onBind()} (mas  necessrio implement-lo se o servio permitir vinculaes).</p>
    366 
    367 <p>Na prxima seo, voc ver como o mesmo tipo de servio  implementado ao estender
    368 a classe de base {@link android.app.Service}, que possui muito mais cdigos, mas que pode
    369 ser apropriada para lidar com solicitaes de inicializao simultneas.</p>
    370 
    371 
    372 <h3 id="ExtendingService">Extenso da classe Service</h3>
    373 
    374 <p>Como voc viu na seo anterior, o uso de {@link android.app.IntentService}
    375 torna a implementao de um servio iniciado muito simples. Se, no entanto, voc precisa do servio
    376 para realizar vrios encadeamentos (em vez de processar as solicitaes de inicializao por meio de uma fila de trabalho),
    377  possvel estender a classe {@link android.app.Service} para lidar com cada inteno.</p>
    378 
    379 <p>Para efeito de comparao, o seguinte exemplo de cdigo  uma implementao da classe {@link
    380 android.app.Service} que realiza exatamente o mesmo trabalho que o exemplo acima usando {@link
    381 android.app.IntentService}. Ou seja, para cada solicitao de inicializao, ela usa um encadeamento
    382 de trabalho para realizar o trabalho e processa apenas uma solicitao por vez.</p>
    383 
    384 <pre>
    385 public class HelloService extends Service {
    386   private Looper mServiceLooper;
    387   private ServiceHandler mServiceHandler;
    388 
    389   // Handler that receives messages from the thread
    390   private final class ServiceHandler extends Handler {
    391       public ServiceHandler(Looper looper) {
    392           super(looper);
    393       }
    394       &#64;Override
    395       public void handleMessage(Message msg) {
    396           // Normally we would do some work here, like download a file.
    397           // For our sample, we just sleep for 5 seconds.
    398           long endTime = System.currentTimeMillis() + 5*1000;
    399           while (System.currentTimeMillis() &lt; endTime) {
    400               synchronized (this) {
    401                   try {
    402                       wait(endTime - System.currentTimeMillis());
    403                   } catch (Exception e) {
    404                   }
    405               }
    406           }
    407           // Stop the service using the startId, so that we don't stop
    408           // the service in the middle of handling another job
    409           stopSelf(msg.arg1);
    410       }
    411   }
    412 
    413   &#64;Override
    414   public void onCreate() {
    415     // Start up the thread running the service.  Note that we create a
    416     // separate thread because the service normally runs in the process's
    417     // main thread, which we don't want to block.  We also make it
    418     // background priority so CPU-intensive work will not disrupt our UI.
    419     HandlerThread thread = new HandlerThread("ServiceStartArguments",
    420             Process.THREAD_PRIORITY_BACKGROUND);
    421     thread.start();
    422 
    423     // Get the HandlerThread's Looper and use it for our Handler
    424     mServiceLooper = thread.getLooper();
    425     mServiceHandler = new ServiceHandler(mServiceLooper);
    426   }
    427 
    428   &#64;Override
    429   public int onStartCommand(Intent intent, int flags, int startId) {
    430       Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
    431 
    432       // For each start request, send a message to start a job and deliver the
    433       // start ID so we know which request we're stopping when we finish the job
    434       Message msg = mServiceHandler.obtainMessage();
    435       msg.arg1 = startId;
    436       mServiceHandler.sendMessage(msg);
    437 
    438       // If we get killed, after returning from here, restart
    439       return START_STICKY;
    440   }
    441 
    442   &#64;Override
    443   public IBinder onBind(Intent intent) {
    444       // We don't provide binding, so return null
    445       return null;
    446   }
    447 
    448   &#64;Override
    449   public void onDestroy() {
    450     Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
    451   }
    452 }
    453 </pre>
    454 
    455 <p>Como pode ver,  muito mais trabalhoso do que usar {@link android.app.IntentService}.</p>
    456 
    457 <p>No entanto, como voc lida com cada chamada de {@link android.app.Service#onStartCommand
    458 onStartCommand()},  possvel realizar vrias solicitaes simultaneamente. Isso no  o que este exemplo faz,
    459 mas, se for o que quer,  possvel criar um novo encadeamento
    460 para cada solicitao e execut-las na hora (em vez de esperar que a solicitao anterior seja concluda).</p>
    461 
    462 <p>Observe que o mtodo {@link android.app.Service#onStartCommand onStartCommand()} deve retornar
    463 um nmero inteiro. O nmero inteiro  um valor que descreve como o sistema deve continuar o servio
    464 no evento em que o sistema o eliminar (como discutido acima, a implementao padro de {@link
    465 android.app.IntentService} lida com isto, apesar de ser possvel modific-lo). O valor de retorno
    466 de {@link android.app.Service#onStartCommand onStartCommand()} deve ser uma das seguintes
    467 constantes:</p>
    468 
    469 <dl>
    470   <dt>{@link android.app.Service#START_NOT_STICKY}</dt>
    471     <dd>Se o sistema eliminar o servio aps o retorno de {@link android.app.Service#onStartCommand
    472 onStartCommand()}, <em>no</em> recrie o servio, a no ser que tenha
    473 intenes pendentes para entregar. Esta  a opo mais segura para evitar executar o servio quando desnecessrio
    474 e quando o aplicativo puder simplesmente reiniciar qualquer trabalho incompleto.</dd>
    475   <dt>{@link android.app.Service#START_STICKY}</dt>
    476     <dd>Se o sistema eliminar o servio aps o retorno de {@link android.app.Service#onStartCommand
    477 onStartCommand()}, recrie o servio e chame {@link
    478 android.app.Service#onStartCommand onStartCommand()}, mas <em>no</em> entregue novamente a ltima inteno.
    479 Em vez disso, o sistema chama {@link android.app.Service#onStartCommand onStartCommand()} com inteno nula,
    480 a no ser que tenha intenes pendentes para iniciar o servio e,
    481 nesse caso, essas intenes so entregues. Isto  adequado para reprodutores de mdia (ou servios semelhantes)
    482 que no estejam executando comandos, mas estejam em execuo indefinidamente e aguardando um trabalho.</dd>
    483   <dt>{@link android.app.Service#START_REDELIVER_INTENT}</dt>
    484     <dd>Se o sistema eliminar o servio aps o retorno de {@link android.app.Service#onStartCommand
    485 onStartCommand()}, recrie o servio e chame {@link
    486 android.app.Service#onStartCommand onStartCommand()} com a ltima inteno que foi entregue
    487 ao servio. Quaisquer intenes pendentes so entregues, por sua vez. Isto  adequado para servios que estejam realizando
    488 um trabalho ativamente que deva ser retomado imediatamente, como o download de um arquivo.</dd>
    489 </dl>
    490 <p>Para obter mais informaes sobre esses valores de retorno, veja a documentao de referncia vinculada
    491 a cada constante.</p>
    492 
    493 
    494 
    495 <h3 id="StartingAService">Incio de um servio</h3>
    496 
    497 <p> possvel iniciar um dispositivo de uma atividade ou outro componente do aplicativo passando uma
    498 {@link android.content.Intent} a {@link
    499 android.content.Context#startService startService()}. O sistema Android chama o mtodo {@link
    500 android.app.Service#onStartCommand onStartCommand()} do servio e passa a ele a {@link
    501 android.content.Intent} (nunca deve-se chamar {@link android.app.Service#onStartCommand
    502 onStartCommand()} diretamente).</p>
    503 
    504 <p>Por exemplo, uma atividade pode iniciar o servio de exemplo na seo anterior ({@code
    505 HelloSevice}) usando uma inteno explcita com {@link android.content.Context#startService
    506 startService()}:</p>
    507 
    508 <pre>
    509 Intent intent = new Intent(this, HelloService.class);
    510 startService(intent);
    511 </pre>
    512 
    513 <p>O mtodo {@link android.content.Context#startService startService()} retorna imediatamente
    514 e o sistema Android chama o mtodo {@link android.app.Service#onStartCommand
    515 onStartCommand()} do servio. Se o servio no estiver em execuo, o sistemo primeiro chama {@link
    516 android.app.Service#onCreate onCreate()} e, em seguida, chama {@link android.app.Service#onStartCommand
    517 onStartCommand()}.</p>
    518 
    519 <p>Se o servio no fornecer vinculao, a inteno entregue com {@link
    520 android.content.Context#startService startService()}  o nico modo de comunicao entre
    521 o componente do aplicativo e o servio. No entanto, se quiser que o servio envie um resultado de volta,
    522 o cliente que iniciar o servio poder criar um {@link android.app.PendingIntent} para uma transmisso
    523 (com {@link android.app.PendingIntent#getBroadcast getBroadcast()}) e entreg-la ao servio
    524 na {@link android.content.Intent} que iniciar o servio. O servio pode ento
    525 usar a transmisso para entregar um resultado.</p>
    526 
    527 <p>Vrias solicitaes para iniciar o servio resultam em diversas chamadas correspondentes
    528 ao {@link android.app.Service#onStartCommand onStartCommand()} do servio. No entanto, somente uma solicitao para interromper
    529 o servio (com {@link android.app.Service#stopSelf stopSelf()} ou {@link
    530 android.content.Context#stopService stopService()})  necessria para interromp-lo.</p>
    531 
    532 
    533 <h3 id="Stopping">Interrupo de um servio</h3>
    534 
    535 <p>Um servio iniciado deve gerenciar seu prprio ciclo de vida. Ou seja, o sistema no interrompe
    536 ou elimina o servio, a no ser que tenha que recuperar a memria do sistema e o servio
    537 continuar em execuo depois que {@link android.app.Service#onStartCommand onStartCommand()} retornar. Portanto,
    538 o servio deve ser interrompido chamando {@link android.app.Service#stopSelf stopSelf()} ou outro
    539 componente pode interromp-lo chamando {@link android.content.Context#stopService stopService()}.</p>
    540 
    541 <p>Ao solicitar o interrompimento com {@link android.app.Service#stopSelf stopSelf()} ou {@link
    542 android.content.Context#stopService stopService()}, o sistema elimina o servio
    543 assim que possvel.</p>
    544 
    545 <p>No entanto, se o servio lida com vrias solicitaes para {@link
    546 android.app.Service#onStartCommand onStartCommand()} ao mesmo tempo, no se deve interromper
    547 o servio ao terminar o processamento de uma solicitao de inicializao, pois  possvel
    548 que uma nova solicitao de inicializao tenha ocorrido (interromper no final da primeira solicitao eliminaria a segunda). Para evitar este problema,
    549  possvel usar {@link android.app.Service#stopSelf(int)} para garantir que a solicitao
    550 que interrompe o servio sempre se baseie na solicitao de inicializao mais recente. Ou seja, ao chamar {@link
    551 android.app.Service#stopSelf(int)}, voc passa o ID da solicitao de inicializao (o <code>startId</code>
    552 entregue a {@link android.app.Service#onStartCommand onStartCommand()}) para aquele que solicitao de interrompimento
    553 corresponde. Em seguida, se o servio receber uma nova solicitao de inicializao antes de ser possvel chamar {@link
    554 android.app.Service#stopSelf(int)}, o ID no corresponder e o servio no ser interrompido.</p>
    555 
    556 <p class="caution"><strong>Ateno:</strong>  importante que um aplicativo interrompa seus servios
    557 quando terminar os trabalhos para evitar o desperdcio dos recursos do sistema e consumo da bateria. Se necessrio,
    558 outros componentes podem interromper o servio chamando {@link
    559 android.content.Context#stopService stopService()}. Mesmo se for possvel vincular-se ao servio,
    560 deve-se sempre interromp-lo por conta prpria se ele tiver recebido uma chamada de {@link
    561 android.app.Service#onStartCommand onStartCommand()}.</p>
    562 
    563 <p>Para obter mais informaes sobre o ciclo de vida de um servio, consulte a seo <a href="#Lifecycle">Gerenciamento do ciclo de vida de um servio</a> abaixo.</p>
    564 
    565 
    566 
    567 <h2 id="CreatingBoundService">Criao de um servio vinculado</h2>
    568 
    569 <p>Um servio vinculado permite que componentes de aplicativo sejam vinculados chamando {@link
    570 android.content.Context#bindService bindService()} para criar uma conexo de longo prazo
    571 (e, geralmente, no permite que os componentes o <em>iniciem</em> chamando {@link
    572 android.content.Context#startService startService()}).</p>
    573 
    574 <p>Deve-se criar um servio vinculado quando se deseja interagir com o servio a partir de atividades
    575 e outros componentes no aplicativo ou para expor algumas das funcionalidades do aplicativo
    576 para outros aplicativos, por meio de comunicao entre processos (IPC).</p>
    577 
    578 <p>Para criar um servio vinculado, voc deve implementar o mtodo de retorno de chamada {@link
    579 android.app.Service#onBind onBind()} para retornar um {@link android.os.IBinder}
    580 que define a interface para a comunicao com o servio. Outros componentes de aplicativo podem chamar
    581 {@link android.content.Context#bindService bindService()} para recuperar a interface
    582 e comear a chamar mtodos no servio. O servio vive somente para servir o componente do aplicativo
    583 ao qual ele est vinculado. Portanto, quando no houver componentes vinculados ao servio, o sistema o eliminar
    584 (<em>no</em>  necessrio interromper um servio vinculado da mesma maneira que quando o servio  iniciado
    585 por meio de {@link android.app.Service#onStartCommand onStartCommand()}).</p>
    586 
    587 <p>Para criar um servio vinculado, a primeira coisa a se fazer  definir a interface que especifica
    588 como um cliente pode comunicar-se com o servidor. Esta interface entre o servio
    589 e um cliente deve ser uma implementao de {@link android.os.IBinder} e  o que o servio deve retornar
    590 a partir do mtodo de retorno de chamada {@link android.app.Service#onBind
    591 onBind()}. Quando o cliente receber {@link android.os.IBinder}, ele poder comear
    592 a interagir com o servio por meio da interface.</p>
    593 
    594 <p>Vrios clientes podem vincular-se ao servio por vez. Quando um cliente terminar de interagir com o servio,
    595  ele chamar {@link android.content.Context#unbindService unbindService()} para desvincular-se. Quando no houver
    596 clientes vinculados ao servio, o sistema o eliminar.</p>
    597 
    598 <p>H vrias maneiras de implementar um servio vinculado e a implementao  mais complicada
    599 que um servio iniciado. Logo, a discusso sobre servios vinculados aparece em um documento separado
    600 sobre <a href="{@docRoot}guide/components/bound-services.html">Servios vinculados</a>.</p>
    601 
    602 
    603 
    604 <h2 id="Notifications">Enviar notificaes ao usurio</h2>
    605 
    606 <p>Quando em execuo, um servio pode notificar o usurio sobre eventos usando <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Notificaes de aviso</a> ou <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notificaes da barra de status</a>.</p>
    607 
    608 <p>Uma notificao de aviso  uma mensagem que aparece na superfcie da janela atual
    609 por um breve momento antes de desaparecer, enquanto que uma notificao da barra de status fornece um cone na barra de status
    610 com uma mensagem que o usurio pode selecionar para realizar uma ao (como iniciar uma atividade).</p>
    611 
    612 <p>Geralmente, uma notificao da barra de status  a melhor tcnica quando um trabalho de segundo plano  concludo
    613 (como download
    614 de arquivo completo) e o usurio pode agir a partir dele. Quando o usurio seleciona a notificao a partir
    615 da vista expandida, ela pode iniciar uma atividade (como a vista do arquivo baixado).</p>
    616 
    617 <p>Consulte os guias de desenvolvedor <a href="{@docRoot}guide/topics/ui/notifiers/toasts.html">Notificaes de aviso</a> ou <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Notificaes da barra de status</a>
    618 para obter mais informaes.</p>
    619 
    620 
    621 
    622 <h2 id="Foreground">Execuo de servio em primeiro plano</h2>
    623 
    624 <p>Um servio de primeiro plano  aquele
    625 com que o usurio est ativamente interagindo e no  uma opo para o sistema elimin-lo quando a memria estiver baixa. Um servio de primeiro plano
    626 deve fornecer uma notificao para a barra de status, que  colocada sob
    627 "o cabealho "Em andamento", o que significa que a notificao no pode ser dispensada a no ser que o servio
    628 seja interrompido ou removido do primeiro plano.</p>
    629 
    630 <p>Por exemplo, um reprodutor de msica que reproduz a partir de um servio deve ser configurado
    631 para permanecer em execuo em primeiro plano, pois o usurio est
    632 prestando ateno em sua operao explicitamente. A notificao na barra de status pode indicar a msica atual
    633 e permitir que o usurio inicie uma atividade para interagir com o reprodutor de msica.</p>
    634 
    635 <p>Para solicitar que o servio seja executado em primeiro plano, chame {@link
    636 android.app.Service#startForeground startForeground()}. Este mtodo usa dois parmetros: um nmero inteiro
    637 que identifica unicamente a notificao e {@link
    638 android.app.Notification} para a barra de status. Por exemplo:</p>
    639 
    640 <pre>
    641 Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
    642         System.currentTimeMillis());
    643 Intent notificationIntent = new Intent(this, ExampleActivity.class);
    644 PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
    645 notification.setLatestEventInfo(this, getText(R.string.notification_title),
    646         getText(R.string.notification_message), pendingIntent);
    647 startForeground(ONGOING_NOTIFICATION_ID, notification);
    648 </pre>
    649 
    650 <p class="caution"><strong>Ateno:</strong> O ID do nmero inteiro fornecido para {@link
    651 android.app.Service#startForeground startForeground()} no deve ser zero.</p>
    652 
    653 
    654 <p>Para remover o servio do primeiro plano, chame {@link
    655 android.app.Service#stopForeground stopForeground()}. Este mtodo usa um booleano,
    656 indicando se deve remover tambm a notificao da barra de status. Este mtodo <em>no</em> interrompe
    657 o servio. No entanto, se voc interromper o servio enquanto estiver em execuo em primeiro plano,
    658 a notificao tambm ser removida.</p>
    659 
    660 <p>Para obter mais informaes sobre notificaes, consulte <a href="{@docRoot}guide/topics/ui/notifiers/notifications.html">Criao de notificaes
    661 da barra de status</a>.</p>
    662 
    663 
    664 
    665 <h2 id="Lifecycle">Gerenciamento do ciclo de vida de um servio</h2>
    666 
    667 <p>O ciclo de vida de um servio  muito mais simples do que o de uma atividade. No entanto,  ainda mais importante
    668 que voc preste muita ateno em como o servio  criado e eliminado, pois ele
    669 pode ser executado em primeiro plano sem que o usurio esteja ciente.</p>
    670 
    671 <p>O ciclo de vida do servio &mdash; desde quando  criado at ser eliminado &mdash; pode seguir
    672 dois caminhos:</p>
    673 
    674 <ul>
    675 <li>Um servio iniciado
    676   <p>O servio  criado quando outro componente chama {@link
    677 android.content.Context#startService startService()}. Depois, o servio permanece em execuo indefinidamente e deve
    678 interromper-se chamando {@link
    679 android.app.Service#stopSelf() stopSelf()}. Outro componente tambm pode interromper
    680 o servio chamando {@link
    681 android.content.Context#stopService stopService()}. Quando o servio  interrompido, o sistema o elimina.</p></li>
    682 
    683 <li>Um servio vinculado
    684   <p>O servio  criado quando outro componente (um cliente) chama {@link
    685 android.content.Context#bindService bindService()}. O cliente comunica-se com o servio
    686 pela interface {@link android.os.IBinder}. O cliente pode escolher encerrar a conexo chamando
    687 {@link android.content.Context#unbindService unbindService()}. Vrios clientes podem ser vinculados
    688 ao mesmo servio e, quando todos os vnculos terminam, o sistema destri o servio (o servio
    689 <em>no</em> precisa ser interrompido).</p></li>
    690 </ul>
    691 
    692 <p>Esses dois caminhos no so inteiramente separados. Ou seja,  possvel vincular um servio
    693 que j foi iniciado com {@link android.content.Context#startService startService()}. Por exemplo, um servio de msica
    694 de segundo plano pode ser iniciado chamando {@link android.content.Context#startService
    695 startService()} com uma {@link android.content.Intent} que identifica a msica reproduzida. Depois,
    696 possivelmente quando o usurio quiser exercer mais controle sobre o reprodutor ou obter informaes
    697 sobre a msica em reproduo, uma atividade pode ser vinculada ao servio chamando {@link
    698 android.content.Context#bindService bindService()}. Em casos como esse, {@link
    699 android.content.Context#stopService stopService()} ou {@link android.app.Service#stopSelf
    700 stopSelf()} no interrompe o servio at que todos os clientes sejam desvinculados. </p>
    701 
    702 
    703 <h3 id="LifecycleCallbacks">Implementao de retornos de chamada do ciclo de vida</h3>
    704 
    705 <p>Como uma atividade, um servio tem um mtodo de ciclo de vida que  possvel implementar
    706 para monitorar as alteraes no estado do servio e realizar trabalhos em momentos adequados. O seguinte servio de esqueleto
    707 demonstra cada um dos mtodos de ciclo de vida:</p>
    708 
    709 <pre>
    710 public class ExampleService extends Service {
    711     int mStartMode;       // indicates how to behave if the service is killed
    712     IBinder mBinder;      // interface for clients that bind
    713     boolean mAllowRebind; // indicates whether onRebind should be used
    714 
    715     &#64;Override
    716     public void {@link android.app.Service#onCreate onCreate}() {
    717         // The service is being created
    718     }
    719     &#64;Override
    720     public int {@link android.app.Service#onStartCommand onStartCommand}(Intent intent, int flags, int startId) {
    721         // The service is starting, due to a call to {@link android.content.Context#startService startService()}
    722         return <em>mStartMode</em>;
    723     }
    724     &#64;Override
    725     public IBinder {@link android.app.Service#onBind onBind}(Intent intent) {
    726         // A client is binding to the service with {@link android.content.Context#bindService bindService()}
    727         return <em>mBinder</em>;
    728     }
    729     &#64;Override
    730     public boolean {@link android.app.Service#onUnbind onUnbind}(Intent intent) {
    731         // All clients have unbound with {@link android.content.Context#unbindService unbindService()}
    732         return <em>mAllowRebind</em>;
    733     }
    734     &#64;Override
    735     public void {@link android.app.Service#onRebind onRebind}(Intent intent) {
    736         // A client is binding to the service with {@link android.content.Context#bindService bindService()},
    737         // after onUnbind() has already been called
    738     }
    739     &#64;Override
    740     public void {@link android.app.Service#onDestroy onDestroy}() {
    741         // The service is no longer used and is being destroyed
    742     }
    743 }
    744 </pre>
    745 
    746 <p class="note"><strong>Observao:</strong> diferentemente dos mtodos de retorno de chamada do ciclo de vida da atividade,
    747 voc <em>no</em> precisa chamar a implementao da superclasse.</p>
    748 
    749 <img src="{@docRoot}images/service_lifecycle.png" alt="" />
    750 <p class="img-caption"><strong>Figura 2.</strong> Ciclo de vida do servio. O diagrama  esquerda
    751 mostra o ciclo de vida quando o servio  criado com {@link android.content.Context#startService
    752 startService()} e o diagrama  direita mostra o ciclo de vida quando o servio
    753  criado com {@link android.content.Context#bindService bindService()}.</p>
    754 
    755 <p>Ao implementar esses mtodos,  possvel monitorar dois retornos (loops) aninhados no ciclo de vida do servio: </p>
    756 
    757 <ul>
    758 <li><strong>Todo o ciclo de vida</strong> de um servio acontece entre o momento em que {@link
    759 android.app.Service#onCreate onCreate()}  chamado e em que {@link
    760 android.app.Service#onDestroy} retorna. Como uma atividade, um servio faz a sua configurao inicial
    761 em {@link android.app.Service#onCreate onCreate()} e libera todos os recursos restantes em {@link
    762 android.app.Service#onDestroy onDestroy()}.  Por exemplo,
    763 um servio de reproduo de msica pode criar um encadeamento onde a msica ser reproduzida em {@link
    764 android.app.Service#onCreate onCreate()}, e interromper o encadeamento em {@link
    765 android.app.Service#onDestroy onDestroy()}.
    766 
    767 <p>Os mtodos {@link android.app.Service#onCreate onCreate()} e {@link android.app.Service#onDestroy
    768 onDestroy()} so chamados para todos os servios,
    769 se tiverem sido criados por {@link android.content.Context#startService startService()} ou {@link
    770 android.content.Context#bindService bindService()}.</p></li>
    771 
    772 <li>O <strong>ciclo de vida ativo</strong> de um servio comea com uma chamada de {@link
    773 android.app.Service#onStartCommand onStartCommand()} ou {@link android.app.Service#onBind onBind()}.
    774 Cada mtodo entrega a {@link
    775 android.content.Intent} que foi passada para {@link android.content.Context#startService
    776 startService()} ou {@link android.content.Context#bindService bindService()}, respectivamente.
    777 <p>Se o servio for iniciado, o ciclo de vida ativo terminar no mesmo momento
    778 em que o ciclo de vida inteiro terminar (o servio permanece ativo mesmo aps o retorno de {@link android.app.Service#onStartCommand
    779 onStartCommand()}). Se o servio estiver vinculado, o ciclo de ida ativo acabar quando {@link
    780 android.app.Service#onUnbind onUnbind()} retornar.</p>
    781 </li>
    782 </ul>
    783 
    784 <p class="note"><strong>Observao:</strong> apesar de um servio iniciado ser interrompido com uma chamada
    785 de {@link android.app.Service#stopSelf stopSelf()} ou {@link
    786 android.content.Context#stopService stopService()}, no h um retorno de chamada respectivo
    787 para o servio (no h retorno de chamada de {@code onStop()}). Portanto, a no ser que o servio esteja vinculado a um cliente,
    788 o sistema o eliminar quando for interrompido &mdash; {@link
    789 android.app.Service#onDestroy onDestroy()} ser o nico retorno de chamada recebido.</p>
    790 
    791 <p>A figura 2 ilustra os mtodos de retorno de chamada tradicionais para um servio. Apesar de a figura separar
    792 os servios que so criados por {@link android.content.Context#startService startService()}
    793 daqueles que so criados por {@link android.content.Context#bindService bindService()},
    794 observe que qualquer servio, no importa como foi iniciado, pode permitir a vinculao de clientes.
    795 Portanto, um servio que j foi iniciado com {@link android.app.Service#onStartCommand
    796 onStartCommand()} (por um cliente chamando  {@link android.content.Context#startService startService()})
    797 ainda pode receber uma chamada de {@link android.app.Service#onBind onBind()} (quando um cliente chama
    798 {@link android.content.Context#bindService bindService()}).</p>
    799 
    800 <p>Para obter mais informaes sobre como criar um servio que fornea vinculao, consulte o documento <a href="{@docRoot}guide/components/bound-services.html">Servios vinculados</a>,
    801 que aborda mais profundamente o mtodo de retorno de chamada {@link android.app.Service#onRebind onRebind()}
    802 na seo sobre <a href="{@docRoot}guide/components/bound-services.html#Lifecycle">Gerenciamento do ciclo de vida
    803 de um servio vinculado</a>.</p>
    804 
    805 
    806 <!--
    807 <h2>Beginner's Path</h2>
    808 
    809 <p>To learn how to query data from the system or other applications (such as contacts or media
    810 stored on the device), continue with the <b><a
    811 href="{@docRoot}guide/topics/providers/content-providers.html">Content Providers</a></b>
    812 document.</p>
    813 -->
    814