1page.title=Processos e encadeamentos 2page.tags=lifecycle,background 3 4@jd:body 5 6<div id="qv-wrapper"> 7<div id="qv"> 8 9<h2>Neste documento</h2> 10<ol> 11<li><a href="#Processes">Processos</a> 12 <ol> 13 <li><a href="#Lifecycle">Ciclo de vida dos processos</a></li> 14 </ol> 15</li> 16<li><a href="#Threads">Encadeamentos</a> 17 <ol> 18 <li><a href="#WorkerThreads">Encadeamentos de trabalho</a></li> 19 <li><a href="#ThreadSafe">Métodos seguros de encadeamento</a></li> 20 </ol> 21</li> 22<li><a href="#IPC">Comunicação entre processos</a></li> 23</ol> 24 25</div> 26</div> 27 28<p>Quando um componente de aplicativo inicia e o aplicativo não tem nenhum outro componente em execução, 29o sistema Android inicia um novo processo no Linux para o aplicativo com um único encadeamento 30de execução. Por padrão, todos os componentes do mesmo aplicativo são executados no mesmo processo 31e encadeamento (chamado de encadeamento "principal"). Se um componente de aplicativo iniciar e já existir um processo 32para este aplicativo (pois outro componente do aplicativo já existe), ele será iniciado 33dentro deste processo e usará o mesmo encadeamento de execução. No entanto, é possível organizar para que vários componentes 34no aplicativo sejam executados em processos separados e criar encadeamentos 35adicionais para qualquer processo.</p> 36 37<p>Este documento discute como os processos e os encadeamentos funcionam em um aplicativo do Android.</p> 38 39 40<h2 id="Processes">Processos</h2> 41 42<p>Por padrão, todos os componentes do mesmo aplicativo são executados no mesmo processo 43e a maioria dos aplicativos não deve alterar isso. No entanto, se achar que precisa de controle sobre o processo a que um certo 44componente pertence, é possível fazer isto no arquivo de manifesto.</p> 45 46<p>A entrada do manifesto para cada tipo de elemento de componente — <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code 47<activity>}</a>, <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code 48<service>}</a>, <a href="{@docRoot}guide/topics/manifest/receiver-element.html">{@code 49<receiver>}</a> e <a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code 50<provider>}</a> — é compatível com um atributo {@code android:process} que pode especificar 51um processo em que este componente deverá ser executado. É possível definir este atributo para que cada componente 52seja executado em seu próprio processo ou para que alguns componentes compartilhem um processo, enquanto que outros não. Também é possível definir 53{@code android:process} para que os componentes de aplicativos diferentes sejam executados no mesmo 54processo — fornecido para que os aplicativos compartilhem o mesmo ID de usuário do Linux e sejam assinados 55com os mesmos certificados.</p> 56 57<p>O elemento <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code 58<application>}</a> também suporta um atributo {@code android:process} 59para definir um valor padrão que se aplique a todos os elementos.</p> 60 61<p>O Android pode decidir desativar um processo em certo ponto, quando a memória estiver baixa e for necessária 62para outros processos que atendem o usuário de forma mais imediata. Os componentes 63de aplicativo em execução no processo que é eliminado são consequentemente eliminados. Um processo é iniciado 64novamente para aqueles componentes quando houver trabalho para eles.</p> 65 66<p>Ao decidir que processo eliminar, o sistema Android avalia a importância relativa dele 67para o usuário. Por exemplo, ele fechará mais prontamente um processo que hospede atividades que não estejam mais 68visíveis na tela, comparado a um processo que hospede atividades visíveis. A decisão 69é exterminar processo ou não, portanto, depende do estado dos componentes em execução neste processo. As regras 70usadas para decidir quais processos serão exterminados são discutidas abaixo. </p> 71 72 73<h3 id="Lifecycle">Ciclo de vida dos processos</h3> 74 75<p>O sistema Android tenta manter um processo do aplicativo pelo maior período possível, 76mas eventualmente precisa remover processos antigos para recuperar memória para processos novos e mais importantes. Para determinar 77quais processos manter 78e quais exterminar, o sistema posiciona cada um em uma "hierarquia de importância" com base 79nos componentes em execução e no estado deles. Processos com menos importância 80serão eliminados primeiro e, em seguida, aqueles com a menor importância depois deles também serão, consecutivamente, até que os recursos 81do sistema sejam recuperados.</p> 82 83<p>Há cinco níveis na hierarquia de importância. A lista a seguir mostra os tipos 84de processo em ordem de importância (o primeiro processo é o <em>mais importante</em> 85e o <em>eliminado por último</em>):</p> 86 87<ol> 88 <li><b>Processos em primeiro plano</b> 89 <p>Um processo necessário para o que o usuário está fazendo. Considera-se 90 um processo como em primeiro plano se qualquer uma das condições for verdadeira:</p> 91 92 <ul> 93 <li>Se ele hospedar uma {@link android.app.Activity} com a qual o usuário esteja interagindo (se o método {@link android.app.Activity#onResume onResume()} de {@link 94android.app.Activity} 95for chamado).</li> 96 97 <li>Se ele hospedar um {@link android.app.Service} vinculado à atividade com a qual o usuário 98esteja interagindo.</li> 99 100 <li>Se ele hospedar um {@link android.app.Service} em execução "em primeiro plano"— se o serviço 101tiver chamado {@link android.app.Service#startForeground startForeground()}. 102 103 <li>Se ele hospedar um {@link android.app.Service} que esteja executando um de seus retornos de chamada 104do ciclo de vida ({@link android.app.Service#onCreate onCreate()}, {@link android.app.Service#onStart 105onStart()}, ou {@link android.app.Service#onDestroy onDestroy()}).</li> 106 107 <li>Se ele hospedar um {@link android.content.BroadcastReceiver} que esteja executando seu método {@link 108 android.content.BroadcastReceiver#onReceive onReceive()}.</li> 109 </ul> 110 111 <p>Geralmente, somente poucos processos em primeiro plano existem em um determinado momento. Eles serão eliminados 112somente como último recurso — se a memória estiver baixa demais para suportar a execução de todos. Geralmente, neste ponto, 113o dispositivo atingiu o estado de paginação de memória. Portanto, eliminar alguns processos em primeiro plano 114é necessário para que a interface permaneça responsiva.</p></li> 115 116 <li><b>Processos visíveis</b> 117 <p>Um processo que não tenha nenhum componente em primeiro plano, 118 mas que ainda possa afetar o que o usuário vê na tela. Um processo é considerado visível 119 se uma das condições a seguir for verdadeira:</p> 120 121 <ul> 122 <li>Se ele hospedar um {@link android.app.Activity} que não esteja em primeiro plano, 123mas ainda seja visível para o usuário (o seu método {@link android.app.Activity#onPause onPause()} tiver sido chamado). 124Isto poderá ocorrer, por exemplo, se a atividade em primeiro plano iniciar um diálogo, o que permitirá 125que a atividade anterior seja vista por trás dela.</li> 126 127 <li>Se ele hospedar um {@link android.app.Service} que esteja vinculado a uma atividade visível 128(ou em primeiro plano).</li> 129 </ul> 130 131 <p>Um processo visível é considerado extremamente importante e não será eliminado a não ser 132que seja necessário para manter em execução os processos em primeiro plano. </p> 133 </li> 134 135 <li><b>Processos de serviço</b> 136 <p>Um processo que esteja executando um serviço que tenha sido iniciado com o método {@link 137android.content.Context#startService startService()} e não 138esteja em uma das duas categorias mais altas. Apesar de processos de serviço não estarem diretamente ligados a tudo o que os usuários veem, 139eles estão geralmente fazendo coisas com que o usuário se importa (como reproduzindo música em segundo plano 140ou baixando dados na rede), então o sistema os mantém em execução a não ser que haja memória suficiente 141para retê-los juntamente com todos os processos visíveis e em primeiro plano. </p> 142 </li> 143 144 <li><b>Processos em segundo plano</b> 145 <p>Um processo que mantenha uma atividade que não esteja atualmente visível para o usuário (se o método 146{@link android.app.Activity#onStop onStop()} da atividade tiver sido chamado). Esses processos não têm impacto direto 147na experiência do usuário e o sistema poderá eliminá-los a qualquer momento para recuperar memória para processos 148em primeiro plano, 149visíveis ou de serviço. Geralmente há vários processos em segundo plano em execução e eles são mantidos 150em uma lista LRU (least recently used - menos usados recentemente) para garantir que o processo com a atividade 151que foi mais vista recentemente pelo usuário seja a última a ser eliminada. Se uma atividade implementar o seu método de ciclo de vida 152corretamente e salvar o estado atual, eliminar o seu processo não terá efeito visível 153na experiência do usuário, pois quando ele navegar de volta à atividade, ela restaurará 154todo o estado visível. Consulte o documento <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Atividades</a> 155para obter informações sobre os estados de restauração e de gravação.</p> 156 </li> 157 158 <li><b>Processos vazios</b> 159 <p>Um processo que não possui nenhum componente de aplicativo ativo. O único motivo para manter este tipo de processo 160ativo é para armazenamento em cache, para aprimorar o tempo de inicialização 161na próxima vez em que um componente precisar executá-lo. O sistema frequentemente elimina esses processos para equilibrar os recursos do sistema em geral 162entre os armazenamentos em cache do processo e os de núcleo subjacente.</p> 163 </li> 164</ol> 165 166 167 <p>O Android coloca o processo no maior nível possível, com base na importância dos componentes 168atualmente ativos no processo. Por exemplo, se um processo hospedar um serviço e uma atividade visível 169, ele terá a classificação de um processo visível, e não a de um processo de serviço.</p> 170 171 <p>Além disso, a classificação de um processo pode ser elevada porque outros processos 172dependem dele — um processo que está servindo a outro processo nunca pode ter classificação menor 173do que a do processo que está sendo servido. Por exemplo, se um provedor de conteúdo no processo A estiver servindo um cliente no processo B, 174ou se um serviço no processo A estiver vinculado a um componente no processo B, o processo A será sempre considerado 175menos importante do que o processo B.</p> 176 177 <p>Como um processo que executa um serviço tem classificação maior do que um processo com atividades em segundo plano, 178uma atividade que iniciar uma operação de longo prazo poderá também iniciar um <a href="{@docRoot}guide/components/services.html">serviço</a> para esta operação, em vez de simplesmente 179criar um encadeamento de trabalho — especificamente se a operação exceder a atividade. 180Por exemplo, uma atividade que esteja fazendo upload de uma imagem para um site deverá iniciar um serviço 181para fazer o upload para que ele possa continuar em segundo plano mesmo se o usuário deixar a atividade. 182Usar um serviço garante que a operação tenha pelo menos a prioridade "processo de serviço", 183independente do que acontecer à atividade. Este é o mesmo motivo pelo qual os receptores de transmissão devem 184empregar serviços em vez de simplesmente usar operações que consomem tempo em um encadeamento.</p> 185 186 187 188 189<h2 id="Threads">Encadeamentos</h2> 190 191<p>Quando um aplicativo é executado, o sistema cria um encadeamento de execução para ele, 192chamado de "principal". Este encadeamento é muito importante, pois está encarregado de despachar eventos 193para os widgets adequados da interface do usuário, incluindo eventos de desenho. É também o encadeamento 194em que o aplicativo interage com componentes do kit de ferramentas da IU do Android (componentes dos pacotes {@link 195android.widget} e {@link android.view}). Portanto, o encadeamento principal, às vezes, 196também chama o encadeamento da IU.</p> 197 198<p>O sistema <em>não</em> cria um encadeamento separado para cada instância de um componente. Todos os componentes 199executados no mesmo processo são instanciados no encadeamento da IU, e as chamadas do sistema 200para cada componente são despachadas deste encadeamento. Consequentemente, métodos que respondam aos retornos de chamada 201(como {@link android.view.View#onKeyDown onKeyDown()} para informar ações de usuário 202ou um método de retorno de chamada do ciclo de vida) sempre serão executados no encadeamento da IU do processo.</p> 203 204<p>Por exemplo, quando o usuário toca em um botão na tela, o encadeamento da IU do aplicativo despacha 205o evento de toque para o widget que, em troca, ativa o seu estado pressionado e publica uma solicitação de invalidação 206à fila do evento. O encadeamento da IU retira a solicitação da fila e notifica o widget de que ele deve 207desenhar novamente por conta própria.</p> 208 209<p>Quando o aplicativo realiza trabalho intenso em resposta à interação do usuário, este modelo de único encadeamento 210pode produzir desempenho inferior a não ser que você implemente o aplicativo adequadamente. Especificamente, se tudo estiver 211acontecendo no encadeamento da IU, realizar operações longas, como acesso à rede 212ou consultas a banco de dados, bloqueará toda a IU. Quando o encadeamento é bloqueado, nenhum evento pode ser despachado, 213incluindo eventos de desenho. Da perspectiva do usuário, 214o aplicativo parece travar. Pior ainda, se o encadeamento da IU for bloqueado por mais do que alguns segundos 215(cerca de 5 segundos atualmente), o usuário receberá a vergonhosa mensagem "<a href="http://developer.android.com/guide/practices/responsiveness.html">aplicativo 216não respondendo</a>" (ANR). O usuário poderá, então, decidir fechar o aplicativo e desinstalá-lo 217se estiver descontente.</p> 218 219<p>Além disso, o kit de ferramentas de IU do Android <em>não</em> é seguro para encadeamentos. Portanto, você não deve manipular a IU 220a partir de um encadeamento de trabalho — deve-se realizar toda a manipulação para a interface do usuário 221a partir do encadeamento da IU. Com isso dito, há duas regras simples para o modelo de encadeamento único do Android:</p> 222 223<ol> 224<li>Não bloquear o encadeamento da IU 225<li>Não acessar o kit de ferramentas de IU do Android fora do encadeamento da IU 226</ol> 227 228<h3 id="WorkerThreads">Encadeamentos de trabalho</h3> 229 230<p>Por causa do modelo de encadeamento único descrito acima, é essencial para a capacidade de resposta da IU do aplicativo 231que você não bloqueie o encadeamento da IU. Caso tenha operações a realizar 232que não sejam instantâneas, deverá certificar-se de fazê-las em encadeamentos separados (encadeamentos de "segundo plano" 233ou "de trabalho").</p> 234 235<p>Por exemplo, abaixo apresenta-se o código de uma escuta de clique que baixa uma imagem de um encadeamento separado 236e exibe-a em uma {@link android.widget.ImageView}:</p> 237 238<pre> 239public void onClick(View v) { 240 new Thread(new Runnable() { 241 public void run() { 242 Bitmap b = loadImageFromNetwork("http://example.com/image.png"); 243 mImageView.setImageBitmap(b); 244 } 245 }).start(); 246} 247</pre> 248 249<p>À primeira vista, parece não apresentar problemas, pois ele cria um novo encadeamento para lidar 250com a operação de rede. No entanto, ele viola a segunda regra do modelo de encadeamento único: <em>não acessar o kit de ferramentas de IU do Android 251de fora do encadeamento da IU</em> — este exemplo modifica o {@link 252android.widget.ImageView} a partir do encadeamento de trabalho em vez de o encadeamento da IU. Isto pode resultar em comportamentos 253inesperados e indefinidos, que podem ser difíceis de rastrear e consumir bastante tempo.</p> 254 255<p>Para resolver este problema, o Android oferece várias maneiras de acessar o encadeamento da IU a partir 256de outros encadeamentos. Abaixo há uma lista dos métodos que podem ajudar:</p> 257 258<ul> 259<li>{@link android.app.Activity#runOnUiThread(java.lang.Runnable) 260Activity.runOnUiThread(Runnable)}</li> 261<li>{@link android.view.View#post(java.lang.Runnable) View.post(Runnable)}</li> 262<li>{@link android.view.View#postDelayed(java.lang.Runnable, long) View.postDelayed(Runnable, 263long)}</li> 264</ul> 265 266<p>Por exemplo, é possível resolver o código acima usando o método {@link 267android.view.View#post(java.lang.Runnable) View.post(Runnable)}:</p> 268 269<pre> 270public void onClick(View v) { 271 new Thread(new Runnable() { 272 public void run() { 273 final Bitmap bitmap = loadImageFromNetwork("http://example.com/image.png"); 274 mImageView.post(new Runnable() { 275 public void run() { 276 mImageView.setImageBitmap(bitmap); 277 } 278 }); 279 } 280 }).start(); 281} 282</pre> 283 284<p>Agora esta implementação é segura para encadeamentos: a operação de rede é concluída a partir de um encadeamento separado 285enquanto que a {@link android.widget.ImageView} é manipulada a partir do encadeamento da IU.</p> 286 287<p>No entanto, à medida que a complexidade da operação aumenta, este tipo de código pode tornar-se complexo 288e difícil demais para ser mantido. Para lidar com interações mais complexas com um encadeamento de trabalho, considere 289usar um {@link android.os.Handler} nele para processar as mensagens entregues 290pelo encadeamento da IU. Apesar de que, talvez, a melhor solução seja estender a classe {@link android.os.AsyncTask}, 291que simplifica a execução das tarefas do encadeamento de trabalho que precisam interagir com a IU.</p> 292 293 294<h4 id="AsyncTask">Uso de AsyncTask</h4> 295 296<p>{@link android.os.AsyncTask} permite que você trabalhe de forma assíncrona 297na interface do usuário. Ela realiza operações de bloqueio em um encadeamento de trabalho e, em seguida, publica os resultados 298no encadeamento da IU, sem que você precise lidar com os encadeamentos e/ou os manipuladores.</p> 299 300<p>Para usá-la, você deve atribuir a subclasse {@link android.os.AsyncTask} e implementar o método de retorno de chamada {@link 301android.os.AsyncTask#doInBackground doInBackground()}, que executa uma série 302de encadeamentos de segundo plano. Para atualizar a IU, deve-se implementar {@link 303android.os.AsyncTask#onPostExecute onPostExecute()}, que entrega o resultado de {@link 304android.os.AsyncTask#doInBackground doInBackground()} e é executado no encadeamento da IU para que seja possível 305atualizar a IU de forma segura. É possível, em seguida, executar a tarefa chamando {@link android.os.AsyncTask#execute execute()} 306a partir do encadeamento da IU.</p> 307 308<p>Por exemplo, é possível implementar o exemplo anterior usando {@link android.os.AsyncTask} 309da seguinte forma:</p> 310 311<pre> 312public void onClick(View v) { 313 new DownloadImageTask().execute("http://example.com/image.png"); 314} 315 316private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> { 317 /** The system calls this to perform work in a worker thread and 318 * delivers it the parameters given to AsyncTask.execute() */ 319 protected Bitmap doInBackground(String... urls) { 320 return loadImageFromNetwork(urls[0]); 321 } 322 323 /** The system calls this to perform work in the UI thread and delivers 324 * the result from doInBackground() */ 325 protected void onPostExecute(Bitmap result) { 326 mImageView.setImageBitmap(result); 327 } 328} 329</pre> 330 331<p>Agora a IU está segura e o código está mais simples, pois ele separa o trabalho 332em uma parte que deve ser feita em um encadeamento de trabalho e outra parte que deve ser feita no encadeamento da IU.</p> 333 334<p>Leia a referência {@link android.os.AsyncTask} para compreender melhor 335o uso desta classe, mas a seguir há uma visão geral rápida sobre como ela funciona:</p> 336 337<ul> 338<li>É possível especificar o tipo dos parâmetros, valores de progresso e valor final 339da tarefa, usando genéricos</li> 340<li>O método {@link android.os.AsyncTask#doInBackground doInBackground()} é executado automaticamente 341em um encadeamento de trabalho</li> 342<li>{@link android.os.AsyncTask#onPreExecute onPreExecute()}, {@link 343android.os.AsyncTask#onPostExecute onPostExecute()} e {@link 344android.os.AsyncTask#onProgressUpdate onProgressUpdate()} são invocados no encadeamento da IU</li> 345<li>O valor retornado por {@link android.os.AsyncTask#doInBackground doInBackground()} 346é enviado para {@link android.os.AsyncTask#onPostExecute onPostExecute()}</li> 347<li>É possível chamar {@link android.os.AsyncTask#publishProgress publishProgress()} a qualquer momento em {@link 348android.os.AsyncTask#doInBackground doInBackground()} para executar {@link 349android.os.AsyncTask#onProgressUpdate onProgressUpdate()} no encadeamento da IU</li> 350<li>É possível cancelar a tarefa a qualquer momento, a partir de qualquer encadeamento</li> 351</ul> 352 353<p class="caution"><strong>Atenção:</strong> outro problema que pode ocorrer ao usar 354um encadeamento de trabalho são reinicializações inesperadas da atividade devido a <a href="{@docRoot}guide/topics/resources/runtime-changes.html">alterações na configuração em tempo de execução</a> 355(como quando o usuário altera a orientação da tela), que podem eliminar o encadeamento de trabalho. Para ver como é possível 356manter uma tarefa durante uma dessas reinicializações e como cancelar adequadamente a tarefa 357quando a atividade for eliminada, consulte o código fonte do aplicativo <a href="http://code.google.com/p/shelves/">Prateleiras</a> de exemplo.</p> 358 359 360<h3 id="ThreadSafe">Métodos seguros de encadeamento</h3> 361 362<p> Em algumas situações, os métodos implementados podem ser chamados a partir de mais de um encadeamento e, portanto, 363devem ser programados para serem seguros para encadeamento. </p> 364 365<p>Isto é especialmente verdadeiro para métodos que podem ser cancelados remotamente — como métodos em um <a href="{@docRoot}guide/components/bound-services.html">serviço vinculado</a>. Quando uma chamada 366de um método implementado em um {@link android.os.IBinder} tiver origem no mesmo processo 367em que {@link android.os.IBinder IBinder} estiver em execução, o método será executado no encadeamento do autor da chamada. 368No entanto, quando a chamada tiver origem em outro processo, o método será executado em um encadeamento 369escolhido a partir de uma série de encadeamentos que o sistema mantém no mesmo processo que {@link android.os.IBinder 370IBinder} (ele não será executado no encadeamento da IU do processo). Por exemplo, enquanto o método 371{@link android.app.Service#onBind onBind()} de um serviço seria chamado a partir de um encadeamento da IU do processo 372de um serviço, os métodos implementados no objeto que {@link android.app.Service#onBind 373onBind()} retorna (por exemplo, uma subclasse que implementa métodos de RPC) seriam chamados 374a partir dos encadeamentos no conjunto. Como um serviço pode ter mais de um cliente, mais de um encadeamento no conjunto 375pode envolver o mesmo método {@link android.os.IBinder IBinder} ao mesmo tempo. Os métodos {@link android.os.IBinder 376IBinder} devem, portanto, ser implementados para serem seguros para encadeamentos.</p> 377 378<p> De forma semelhante, um provedor de conteúdo pode receber solicitações de dados que tenham origem em outros processos. 379Apesar de as classes {@link android.content.ContentResolver} e {@link android.content.ContentProvider} 380ocultarem os detalhes de como a comunicação entre processos é gerenciada, os métodos {@link 381android.content.ContentProvider} que respondem a essas solicitações — os métodos {@link 382android.content.ContentProvider#query query()}, {@link android.content.ContentProvider#insert 383insert()}, {@link android.content.ContentProvider#delete delete()}, {@link 384android.content.ContentProvider#update update()} e {@link android.content.ContentProvider#getType 385getType()} — serão chamados de um conjunto de encadeamentos no processo do provedor de conteúdo, não no encadeamento da IU 386para o processo. Como esses métodos podem ser chamados a partir de qualquer quantidade de encadeamentos 387ao mesmo tempo, eles também devem ser implementados para serem seguros para encadeamento. </p> 388 389 390<h2 id="IPC">Comunicação entre processos</h2> 391 392<p>O Android oferece um mecanismo para comunicação entre processos (IPC) usando chamadas de procedimento remoto (RPCs), 393onde um método é chamado por uma atividade ou outro componente de aplicativo, mas é executado 394remotamente (em outro processo), com qualquer resultado retornado 395de volta ao autor da chamada. Isto acarreta na decomposição de uma chamada de método e de seus dados para um nível em que o sistema operacional 396possa entender, transmitindo-a do processo local e do espaço de endereço ao processo remoto 397e ao espaço de endereço e, em seguida, remontando e restabelecendo a chamada lá. Os valores de retorno 398são transmitidos na direção oposta. O Android fornece todo o código para realizar essas operações 399de IPC para que você possa concentrar-se em definir e implementar a interface de programação de RPC. </p> 400 401<p>Para realizar o IPC, o aplicativo deve vincular-se a um serviço usando {@link 402android.content.Context#bindService bindService()}. Para obter mais informações, consulte o guia do desenvolvedor <a href="{@docRoot}guide/components/services.html">Serviços</a>.</p> 403 404 405<!-- 406<h2>Beginner's Path</h2> 407 408<p>For information about how to perform work in the background for an indefinite period of time 409(without a user interface), continue with the <b><a 410href="{@docRoot}guide/components/services.html">Services</a></b> document.</p> 411--> 412