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 &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; é 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 &mdash; 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&lt;application&gt;}</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"&mdash; 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 &mdash; 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 &mdash; 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 &mdash; 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 &mdash; 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> &mdash; 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&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 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 &mdash; 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 &mdash; 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()} &mdash; 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