Home | History | Annotate | Download | only in components
      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 &mdash; <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
     47 &lt;activity&gt;}</a>, <a href="{@docRoot}guide/topics/manifest/service-element.html">{@code
     48 &lt;service&gt;}</a>, <a href="{@docRoot}guide/topics/manifest/receiver-element.html">{@code
     49 &lt;receiver&gt;}</a> e <a href="{@docRoot}guide/topics/manifest/provider-element.html">{@code
     50 &lt;provider&gt;}</a> &mdash;  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 &mdash; 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 &lt;application&gt;}</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"&mdash; 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 &mdash; 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 &mdash; 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 &mdash; 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 &mdash; 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> &mdash; 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&lt;String, Void, Bitmap&gt; {
    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 &mdash; 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 &mdash; 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()} &mdash; 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