1 page.title=Processos e encadeamentos 2 page.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">Mtodos seguros de encadeamento</a></li> 20 </ol> 21 </li> 22 <li><a href="#IPC">Comunicao entre processos</a></li> 23 </ol> 24 25 </div> 26 </div> 27 28 <p>Quando um componente de aplicativo inicia e o aplicativo no tem nenhum outro componente em execuo, 29 o sistema Android inicia um novo processo no Linux para o aplicativo com um nico encadeamento 30 de execuo. Por padro, todos os componentes do mesmo aplicativo so executados no mesmo processo 31 e encadeamento (chamado de encadeamento "principal"). Se um componente de aplicativo iniciar e j existir um processo 32 para este aplicativo (pois outro componente do aplicativo j existe), ele ser iniciado 33 dentro deste processo e usar o mesmo encadeamento de execuo. No entanto, possvel organizar para que vrios componentes 34 no aplicativo sejam executados em processos separados e criar encadeamentos 35 adicionais 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 padro, todos os componentes do mesmo aplicativo so executados no mesmo processo 43 e a maioria dos aplicativos no deve alterar isso. No entanto, se achar que precisa de controle sobre o processo a que um certo 44 componente pertence, possvel 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> — compatvel com um atributo {@code android:process} que pode especificar 51 um processo em que este componente dever ser executado. possvel definir este atributo para que cada componente 52 seja executado em seu prprio processo ou para que alguns componentes compartilhem um processo, enquanto que outros no. Tambm possvel definir 53 {@code android:process} para que os componentes de aplicativos diferentes sejam executados no mesmo 54 processo — fornecido para que os aplicativos compartilhem o mesmo ID de usurio do Linux e sejam assinados 55 com os mesmos certificados.</p> 56 57 <p>O elemento <a href="{@docRoot}guide/topics/manifest/application-element.html">{@code 58 <application>}</a> tambm suporta um atributo {@code android:process} 59 para definir um valor padro que se aplique a todos os elementos.</p> 60 61 <p>O Android pode decidir desativar um processo em certo ponto, quando a memria estiver baixa e for necessria 62 para outros processos que atendem o usurio de forma mais imediata. Os componentes 63 de aplicativo em execuo no processo que eliminado so consequentemente eliminados. Um processo iniciado 64 novamente para aqueles componentes quando houver trabalho para eles.</p> 65 66 <p>Ao decidir que processo eliminar, o sistema Android avalia a importncia relativa dele 67 para o usurio. Por exemplo, ele fechar mais prontamente um processo que hospede atividades que no estejam mais 68 visveis na tela, comparado a um processo que hospede atividades visveis. A deciso 69 exterminar processo ou no, portanto, depende do estado dos componentes em execuo neste processo. As regras 70 usadas para decidir quais processos sero exterminados so 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 perodo possvel, 76 mas eventualmente precisa remover processos antigos para recuperar memria para processos novos e mais importantes. Para determinar 77 quais processos manter 78 e quais exterminar, o sistema posiciona cada um em uma "hierarquia de importncia" com base 79 nos componentes em execuo e no estado deles. Processos com menos importncia 80 sero eliminados primeiro e, em seguida, aqueles com a menor importncia depois deles tambm sero, consecutivamente, at que os recursos 81 do sistema sejam recuperados.</p> 82 83 <p>H cinco nveis na hierarquia de importncia. A lista a seguir mostra os tipos 84 de processo em ordem de importncia (o primeiro processo o <em>mais importante</em> 85 e o <em>eliminado por ltimo</em>):</p> 86 87 <ol> 88 <li><b>Processos em primeiro plano</b> 89 <p>Um processo necessrio para o que o usurio est fazendo. Considera-se 90 um processo como em primeiro plano se qualquer uma das condies for verdadeira:</p> 91 92 <ul> 93 <li>Se ele hospedar uma {@link android.app.Activity} com a qual o usurio esteja interagindo (se o mtodo {@link android.app.Activity#onResume onResume()} de {@link 94 android.app.Activity} 95 for chamado).</li> 96 97 <li>Se ele hospedar um {@link android.app.Service} vinculado atividade com a qual o usurio 98 esteja interagindo.</li> 99 100 <li>Se ele hospedar um {@link android.app.Service} em execuo "em primeiro plano"— se o servio 101 tiver 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 104 do ciclo de vida ({@link android.app.Service#onCreate onCreate()}, {@link android.app.Service#onStart 105 onStart()}, ou {@link android.app.Service#onDestroy onDestroy()}).</li> 106 107 <li>Se ele hospedar um {@link android.content.BroadcastReceiver} que esteja executando seu mtodo {@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 sero eliminados 112 somente como ltimo recurso — se a memria estiver baixa demais para suportar a execuo de todos. Geralmente, neste ponto, 113 o dispositivo atingiu o estado de paginao de memria. Portanto, eliminar alguns processos em primeiro plano 114 necessrio para que a interface permanea responsiva.</p></li> 115 116 <li><b>Processos visveis</b> 117 <p>Um processo que no tenha nenhum componente em primeiro plano, 118 mas que ainda possa afetar o que o usurio v na tela. Um processo considerado visvel 119 se uma das condies a seguir for verdadeira:</p> 120 121 <ul> 122 <li>Se ele hospedar um {@link android.app.Activity} que no esteja em primeiro plano, 123 mas ainda seja visvel para o usurio (o seu mtodo {@link android.app.Activity#onPause onPause()} tiver sido chamado). 124 Isto poder ocorrer, por exemplo, se a atividade em primeiro plano iniciar um dilogo, o que permitir 125 que a atividade anterior seja vista por trs dela.</li> 126 127 <li>Se ele hospedar um {@link android.app.Service} que esteja vinculado a uma atividade visvel 128 (ou em primeiro plano).</li> 129 </ul> 130 131 <p>Um processo visvel considerado extremamente importante e no ser eliminado a no ser 132 que seja necessrio para manter em execuo os processos em primeiro plano. </p> 133 </li> 134 135 <li><b>Processos de servio</b> 136 <p>Um processo que esteja executando um servio que tenha sido iniciado com o mtodo {@link 137 android.content.Context#startService startService()} e no 138 esteja em uma das duas categorias mais altas. Apesar de processos de servio no estarem diretamente ligados a tudo o que os usurios veem, 139 eles esto geralmente fazendo coisas com que o usurio se importa (como reproduzindo msica em segundo plano 140 ou baixando dados na rede), ento o sistema os mantm em execuo a no ser que haja memria suficiente 141 para ret-los juntamente com todos os processos visveis 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 no esteja atualmente visvel para o usurio (se o mtodo 146 {@link android.app.Activity#onStop onStop()} da atividade tiver sido chamado). Esses processos no tm impacto direto 147 na experincia do usurio e o sistema poder elimin-los a qualquer momento para recuperar memria para processos 148 em primeiro plano, 149 visveis ou de servio. Geralmente h vrios processos em segundo plano em execuo e eles so mantidos 150 em uma lista LRU (least recently used - menos usados recentemente) para garantir que o processo com a atividade 151 que foi mais vista recentemente pelo usurio seja a ltima a ser eliminada. Se uma atividade implementar o seu mtodo de ciclo de vida 152 corretamente e salvar o estado atual, eliminar o seu processo no ter efeito visvel 153 na experincia do usurio, pois quando ele navegar de volta atividade, ela restaurar 154 todo o estado visvel. Consulte o documento <a href="{@docRoot}guide/components/activities.html#SavingActivityState">Atividades</a> 155 para obter informaes sobre os estados de restaurao e de gravao.</p> 156 </li> 157 158 <li><b>Processos vazios</b> 159 <p>Um processo que no possui nenhum componente de aplicativo ativo. O nico motivo para manter este tipo de processo 160 ativo para armazenamento em cache, para aprimorar o tempo de inicializao 161 na prxima vez em que um componente precisar execut-lo. O sistema frequentemente elimina esses processos para equilibrar os recursos do sistema em geral 162 entre os armazenamentos em cache do processo e os de ncleo subjacente.</p> 163 </li> 164 </ol> 165 166 167 <p>O Android coloca o processo no maior nvel possvel, com base na importncia dos componentes 168 atualmente ativos no processo. Por exemplo, se um processo hospedar um servio e uma atividade visvel 169 , ele ter a classificao de um processo visvel, e no a de um processo de servio.</p> 170 171 <p>Alm disso, a classificao de um processo pode ser elevada porque outros processos 172 dependem dele — um processo que est servindo a outro processo nunca pode ter classificao menor 173 do que a do processo que est sendo servido. Por exemplo, se um provedor de contedo no processo A estiver servindo um cliente no processo B, 174 ou se um servio no processo A estiver vinculado a um componente no processo B, o processo A ser sempre considerado 175 menos importante do que o processo B.</p> 176 177 <p>Como um processo que executa um servio tem classificao maior do que um processo com atividades em segundo plano, 178 uma atividade que iniciar uma operao de longo prazo poder tambm iniciar um <a href="{@docRoot}guide/components/services.html">servio</a> para esta operao, em vez de simplesmente 179 criar um encadeamento de trabalho — especificamente se a operao exceder a atividade. 180 Por exemplo, uma atividade que esteja fazendo upload de uma imagem para um site dever iniciar um servio 181 para fazer o upload para que ele possa continuar em segundo plano mesmo se o usurio deixar a atividade. 182 Usar um servio garante que a operao tenha pelo menos a prioridade "processo de servio", 183 independente do que acontecer atividade. Este o mesmo motivo pelo qual os receptores de transmisso devem 184 empregar servios em vez de simplesmente usar operaes 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 execuo para ele, 192 chamado de "principal". Este encadeamento muito importante, pois est encarregado de despachar eventos 193 para os widgets adequados da interface do usurio, incluindo eventos de desenho. tambm o encadeamento 194 em que o aplicativo interage com componentes do kit de ferramentas da IU do Android (componentes dos pacotes {@link 195 android.widget} e {@link android.view}). Portanto, o encadeamento principal, s vezes, 196 tambm chama o encadeamento da IU.</p> 197 198 <p>O sistema <em>no</em> cria um encadeamento separado para cada instncia de um componente. Todos os componentes 199 executados no mesmo processo so instanciados no encadeamento da IU, e as chamadas do sistema 200 para cada componente so despachadas deste encadeamento. Consequentemente, mtodos que respondam aos retornos de chamada 201 (como {@link android.view.View#onKeyDown onKeyDown()} para informar aes de usurio 202 ou um mtodo de retorno de chamada do ciclo de vida) sempre sero executados no encadeamento da IU do processo.</p> 203 204 <p>Por exemplo, quando o usurio toca em um boto na tela, o encadeamento da IU do aplicativo despacha 205 o evento de toque para o widget que, em troca, ativa o seu estado pressionado e publica uma solicitao de invalidao 206 fila do evento. O encadeamento da IU retira a solicitao da fila e notifica o widget de que ele deve 207 desenhar novamente por conta prpria.</p> 208 209 <p>Quando o aplicativo realiza trabalho intenso em resposta interao do usurio, este modelo de nico encadeamento 210 pode produzir desempenho inferior a no ser que voc implemente o aplicativo adequadamente. Especificamente, se tudo estiver 211 acontecendo no encadeamento da IU, realizar operaes longas, como acesso rede 212 ou consultas a banco de dados, bloquear toda a IU. Quando o encadeamento bloqueado, nenhum evento pode ser despachado, 213 incluindo eventos de desenho. Da perspectiva do usurio, 214 o 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 usurio receber a vergonhosa mensagem "<a href="http://developer.android.com/guide/practices/responsiveness.html">aplicativo 216 no respondendo</a>" (ANR). O usurio poder, ento, decidir fechar o aplicativo e desinstal-lo 217 se estiver descontente.</p> 218 219 <p>Alm disso, o kit de ferramentas de IU do Android <em>no</em> seguro para encadeamentos. Portanto, voc no deve manipular a IU 220 a partir de um encadeamento de trabalho — deve-se realizar toda a manipulao para a interface do usurio 221 a 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>No bloquear o encadeamento da IU 225 <li>No 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 231 que voc no bloqueie o encadeamento da IU. Caso tenha operaes a realizar 232 que no sejam instantneas, dever certificar-se de faz-las em encadeamentos separados (encadeamentos de "segundo plano" 233 ou "de trabalho").</p> 234 235 <p>Por exemplo, abaixo apresenta-se o cdigo de uma escuta de clique que baixa uma imagem de um encadeamento separado 236 e exibe-a em uma {@link android.widget.ImageView}:</p> 237 238 <pre> 239 public 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 no apresentar problemas, pois ele cria um novo encadeamento para lidar 250 com a operao de rede. No entanto, ele viola a segunda regra do modelo de encadeamento nico: <em>no acessar o kit de ferramentas de IU do Android 251 de fora do encadeamento da IU</em> — este exemplo modifica o {@link 252 android.widget.ImageView} a partir do encadeamento de trabalho em vez de o encadeamento da IU. Isto pode resultar em comportamentos 253 inesperados e indefinidos, que podem ser difceis de rastrear e consumir bastante tempo.</p> 254 255 <p>Para resolver este problema, o Android oferece vrias maneiras de acessar o encadeamento da IU a partir 256 de outros encadeamentos. Abaixo h uma lista dos mtodos que podem ajudar:</p> 257 258 <ul> 259 <li>{@link android.app.Activity#runOnUiThread(java.lang.Runnable) 260 Activity.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, 263 long)}</li> 264 </ul> 265 266 <p>Por exemplo, possvel resolver o cdigo acima usando o mtodo {@link 267 android.view.View#post(java.lang.Runnable) View.post(Runnable)}:</p> 268 269 <pre> 270 public 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 implementao segura para encadeamentos: a operao de rede concluda a partir de um encadeamento separado 285 enquanto que a {@link android.widget.ImageView} manipulada a partir do encadeamento da IU.</p> 286 287 <p>No entanto, medida que a complexidade da operao aumenta, este tipo de cdigo pode tornar-se complexo 288 e difcil demais para ser mantido. Para lidar com interaes mais complexas com um encadeamento de trabalho, considere 289 usar um {@link android.os.Handler} nele para processar as mensagens entregues 290 pelo encadeamento da IU. Apesar de que, talvez, a melhor soluo seja estender a classe {@link android.os.AsyncTask}, 291 que simplifica a execuo 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 assncrona 297 na interface do usurio. Ela realiza operaes de bloqueio em um encadeamento de trabalho e, em seguida, publica os resultados 298 no 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 mtodo de retorno de chamada {@link 301 android.os.AsyncTask#doInBackground doInBackground()}, que executa uma srie 302 de encadeamentos de segundo plano. Para atualizar a IU, deve-se implementar {@link 303 android.os.AsyncTask#onPostExecute onPostExecute()}, que entrega o resultado de {@link 304 android.os.AsyncTask#doInBackground doInBackground()} e executado no encadeamento da IU para que seja possvel 305 atualizar a IU de forma segura. possvel, em seguida, executar a tarefa chamando {@link android.os.AsyncTask#execute execute()} 306 a partir do encadeamento da IU.</p> 307 308 <p>Por exemplo, possvel implementar o exemplo anterior usando {@link android.os.AsyncTask} 309 da seguinte forma:</p> 310 311 <pre> 312 public void onClick(View v) { 313 new DownloadImageTask().execute("http://example.com/image.png"); 314 } 315 316 private 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 cdigo est mais simples, pois ele separa o trabalho 332 em 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 referncia {@link android.os.AsyncTask} para compreender melhor 335 o uso desta classe, mas a seguir h uma viso geral rpida sobre como ela funciona:</p> 336 337 <ul> 338 <li> possvel especificar o tipo dos parmetros, valores de progresso e valor final 339 da tarefa, usando genricos</li> 340 <li>O mtodo {@link android.os.AsyncTask#doInBackground doInBackground()} executado automaticamente 341 em um encadeamento de trabalho</li> 342 <li>{@link android.os.AsyncTask#onPreExecute onPreExecute()}, {@link 343 android.os.AsyncTask#onPostExecute onPostExecute()} e {@link 344 android.os.AsyncTask#onProgressUpdate onProgressUpdate()} so 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> possvel chamar {@link android.os.AsyncTask#publishProgress publishProgress()} a qualquer momento em {@link 348 android.os.AsyncTask#doInBackground doInBackground()} para executar {@link 349 android.os.AsyncTask#onProgressUpdate onProgressUpdate()} no encadeamento da IU</li> 350 <li> possvel cancelar a tarefa a qualquer momento, a partir de qualquer encadeamento</li> 351 </ul> 352 353 <p class="caution"><strong>Ateno:</strong> outro problema que pode ocorrer ao usar 354 um encadeamento de trabalho so reinicializaes inesperadas da atividade devido a <a href="{@docRoot}guide/topics/resources/runtime-changes.html">alteraes na configurao em tempo de execuo</a> 355 (como quando o usurio altera a orientao da tela), que podem eliminar o encadeamento de trabalho. Para ver como possvel 356 manter uma tarefa durante uma dessas reinicializaes e como cancelar adequadamente a tarefa 357 quando a atividade for eliminada, consulte o cdigo fonte do aplicativo <a href="http://code.google.com/p/shelves/">Prateleiras</a> de exemplo.</p> 358 359 360 <h3 id="ThreadSafe">Mtodos seguros de encadeamento</h3> 361 362 <p> Em algumas situaes, os mtodos implementados podem ser chamados a partir de mais de um encadeamento e, portanto, 363 devem ser programados para serem seguros para encadeamento. </p> 364 365 <p>Isto especialmente verdadeiro para mtodos que podem ser cancelados remotamente — como mtodos em um <a href="{@docRoot}guide/components/bound-services.html">servio vinculado</a>. Quando uma chamada 366 de um mtodo implementado em um {@link android.os.IBinder} tiver origem no mesmo processo 367 em que {@link android.os.IBinder IBinder} estiver em execuo, o mtodo ser executado no encadeamento do autor da chamada. 368 No entanto, quando a chamada tiver origem em outro processo, o mtodo ser executado em um encadeamento 369 escolhido a partir de uma srie de encadeamentos que o sistema mantm no mesmo processo que {@link android.os.IBinder 370 IBinder} (ele no ser executado no encadeamento da IU do processo). Por exemplo, enquanto o mtodo 371 {@link android.app.Service#onBind onBind()} de um servio seria chamado a partir de um encadeamento da IU do processo 372 de um servio, os mtodos implementados no objeto que {@link android.app.Service#onBind 373 onBind()} retorna (por exemplo, uma subclasse que implementa mtodos de RPC) seriam chamados 374 a partir dos encadeamentos no conjunto. Como um servio pode ter mais de um cliente, mais de um encadeamento no conjunto 375 pode envolver o mesmo mtodo {@link android.os.IBinder IBinder} ao mesmo tempo. Os mtodos {@link android.os.IBinder 376 IBinder} devem, portanto, ser implementados para serem seguros para encadeamentos.</p> 377 378 <p> De forma semelhante, um provedor de contedo pode receber solicitaes de dados que tenham origem em outros processos. 379 Apesar de as classes {@link android.content.ContentResolver} e {@link android.content.ContentProvider} 380 ocultarem os detalhes de como a comunicao entre processos gerenciada, os mtodos {@link 381 android.content.ContentProvider} que respondem a essas solicitaes — os mtodos {@link 382 android.content.ContentProvider#query query()}, {@link android.content.ContentProvider#insert 383 insert()}, {@link android.content.ContentProvider#delete delete()}, {@link 384 android.content.ContentProvider#update update()} e {@link android.content.ContentProvider#getType 385 getType()} — sero chamados de um conjunto de encadeamentos no processo do provedor de contedo, no no encadeamento da IU 386 para o processo. Como esses mtodos podem ser chamados a partir de qualquer quantidade de encadeamentos 387 ao mesmo tempo, eles tambm devem ser implementados para serem seguros para encadeamento. </p> 388 389 390 <h2 id="IPC">Comunicao entre processos</h2> 391 392 <p>O Android oferece um mecanismo para comunicao entre processos (IPC) usando chamadas de procedimento remoto (RPCs), 393 onde um mtodo chamado por uma atividade ou outro componente de aplicativo, mas executado 394 remotamente (em outro processo), com qualquer resultado retornado 395 de volta ao autor da chamada. Isto acarreta na decomposio de uma chamada de mtodo e de seus dados para um nvel em que o sistema operacional 396 possa entender, transmitindo-a do processo local e do espao de endereo ao processo remoto 397 e ao espao de endereo e, em seguida, remontando e restabelecendo a chamada l. Os valores de retorno 398 so transmitidos na direo oposta. O Android fornece todo o cdigo para realizar essas operaes 399 de IPC para que voc possa concentrar-se em definir e implementar a interface de programao de RPC. </p> 400 401 <p>Para realizar o IPC, o aplicativo deve vincular-se a um servio usando {@link 402 android.content.Context#bindService bindService()}. Para obter mais informaes, consulte o guia do desenvolvedor <a href="{@docRoot}guide/components/services.html">Servios</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 410 href="{@docRoot}guide/components/services.html">Services</a></b> document.</p> 411 --> 412