• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Atividades
2page.tags=atividade,intenção
3@jd:body
4
5<div id="qv-wrapper">
6<div id="qv">
7<h2>Neste documento</h2>
8<ol>
9  <li><a href="#Creating">Criação de uma atividade</a>
10    <ol>
11      <li><a href="#UI">Implementação de uma interface do usuário</a></li>
12      <li><a href="#Declaring">Declaração de uma atividade no manifesto</a></li>
13    </ol>
14  </li>
15  <li><a href="#StartingAnActivity">Início de uma atividade</a>
16    <ol>
17      <li><a href="#StartingAnActivityForResult">Início de uma atividade de um resultado</a></li>
18    </ol>
19  </li>
20  <li><a href="#ShuttingDown">Encerramento de uma atividade</a></li>
21  <li><a href="#Lifecycle">Gerenciamento do ciclo de vida da atividade</a>
22    <ol>
23      <li><a href="#ImplementingLifecycleCallbacks">Implementação de retornos de chamada do ciclo de vida</a></li>
24      <li><a href="#SavingActivityState">Gravação do estado da atividade</a></li>
25      <li><a href="#ConfigurationChanges">Manipulação de alterações de configuração</a></li>
26      <li><a href="#CoordinatingActivities">Coordenação de atividades</a></li>
27    </ol>
28  </li>
29</ol>
30
31<h2>Classes principais</h2>
32<ol>
33  <li>{@link android.app.Activity}</li>
34</ol>
35
36<h2>Veja também</h2>
37<ol>
38  <li><a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tarefas e pilha
39de retorno</a></li>
40</ol>
41
42</div>
43</div>
44
45
46
47<p>{@link android.app.Activity} é um componente de aplicativo que fornece uma tela com a qual
48os usuários podem interagir para fazer algo, como discar um número no telefone, tirar uma foto, enviar um e-mail
49ou ver um mapa. Cada atividade recebe uma janela que exibe a interface do usuário. Geralmente, a janela
50preenche a tela, mas pode ser menor que a tela e flutuar
51sobre outras janelas.</p>
52
53<p> Aplicativos geralmente possuem várias atividades pouco vinculadas
54entre si. Normalmente, uma atividade em um aplicativo é especificada como "principal",
55que é a apresentada ao usuário ao iniciar o aplicativo pela primeira vez. Cada
56atividade pode, então, iniciar outra atividade para executar diferentes ações. Ao iniciar uma nova
57atividade, a atividade anterior é interrompida, mas o sistema conserva a atividade
58em uma pilha (a "pilha de retorno"). Quando uma atividade inicia, ela é enviada para a pilha de retorno
59e obtém o foco do usuário. A pilha de retorno segue o mecanismo básico de pilha UEPS (o último que entra é o primeiro que sai).
60Assim, quando o usuário terminar a atividade atual e apertar o botão <em>Voltar</em>,
61ela sairá da pilha (é destruída) e a atividade anterior será retomada (a pilha de retorno
62é discutida em mais detalhes no documento <a href="{@docRoot}guide/components/tasks-and-back-stack.html">Tarefas
63e Pilha de Retorno</a>).</p>
64
65<p>Quando uma atividade é interrompida devido ao início de uma nova atividade, ela é notificada acerca dessa alteração de estado
66por meio de métodos de retorno de chamada do ciclo de vida da atividade.
67Há diversos métodos de retorno de chamada que uma atividade pode receber devido a uma alteração
68em seu estado &mdash; quando o sistema a está criando, interrompendo, retomando ou destruindo &mdash; e cada
69retorno de chamada oferece uma oportunidade de executar trabalhos específicos
70adequados a essa alteração de estado. Por exemplo: quando interrompida, a atividade deve liberar
71todos os objetos grandes, como conexões com a rede ou com um banco de dados. Quando a atividade for retomada, será possível
72readquirir os recursos necessários e retomar as ações interrompidas. Essas transições de estado
73são parte do ciclo de vida da atividade.</p>
74
75<p>O restante deste documento discute o básico sobre a compilação e o uso de uma atividade,
76incluindo uma discussão completa sobre o funcionamento do ciclo de vida da atividade para gerenciar adequadamente
77a transição entre os diversos estados da atividade.</p>
78
79
80
81<h2 id="Creating">Criação de uma atividade</h2>
82
83<p>Para criar uma atividade, é preciso criar uma subclasse de {@link android.app.Activity}
84(ou uma respectiva subclasse existente). Na subclasse, é preciso implementar um método de retorno de chamada
85que o sistema chama quando ocorre a transição entre os diversos estados de seu ciclo de vida,
86como na criação, interrupção, retomada ou destruição da atividade. Os dois métodos mais importantes
87de retorno de chamada são:</p>
88
89<dl>
90  <dt>{@link android.app.Activity#onCreate onCreate()}</dt>
91  <dd>É preciso implementar esse método. O sistema o chama ao criar
92a atividade. Na implementação, é preciso inicializar os componentes essenciais
93da atividade.
94    E, fundamentalmente, é quando se deve chamar {@link android.app.Activity#setContentView
95setContentView()} para definir o layout da interface do usuário da atividade.</dd>
96  <dt>{@link android.app.Activity#onPause onPause()}</dt>
97  <dd>O sistema chama esse método como o primeiro indício de que o usuário está saindo
98da atividade (embora não seja sempre uma indicação de que a atividade será destruída). É quando geralmente
99se deve confirmar qualquer alteração que deva persistir além da sessão do usuário atual (porque
100o usuário pode não retornar).</dd>
101</dl>
102
103<p>Há outros métodos de retorno de chamada do ciclo de vida que se pode usar para oferecer
104uma experiência fluida ao usuário entre atividades e manipular interrupções inesperadas que venham a parar
105ou até a destruir a atividade. Todos os métodos de retorno de chamada do ciclo de vida serão discutidos mais adiante
106na seção sobre <a href="#Lifecycle">Gerenciamento do ciclo de vida da atividade</a>.</p>
107
108
109
110<h3 id="UI">Implementação de uma interface do usuário</h3>
111
112<p> A interface do usuário de uma atividade é fornecida por uma hierarquia de objetos &mdash; de vistas derivados
113da classe {@link android.view.View}.  Cada vista controla um espaço retangular específico
114dentro da janela da atividade e pode responder à interação com o usuário. Por exemplo: uma vista pode ser
115um botão que inicia uma ação quando o usuário toca nele.</p>
116
117<p>O Android oferece algumas vistas prontas que podem ser usadas para projetar e organizar
118o layout. "Widgets" são vistas que fornecem elementos visuais (e interativos) à tela,
119como um botão, um campo de texto, uma caixa de seleção ou apenas uma imagem. "Layouts" são vistas derivadas de {@link
120android.view.ViewGroup} que oferecem um modelo de layout exclusivo para suas vistas filhas,
121como um layout linear, um layout em grade ou um layout relativo. Também é possível definir como subclasse as classes
122{@link android.view.View} e {@link android.view.ViewGroup} (ou subclasses existentes) para criar widgets e layouts próprios
123e aplicá-los no layout da atividade.</p>
124
125<p>A forma mais comum de definir um layout usando vistas é com um arquivo de layout XML salvo
126nos recursos do aplicativo. Assim, é possível manter o projeto da interface do usuário separado
127do código fonte que define o comportamento da atividade. É possível definir o layout como a IU da atividade
128com {@link android.app.Activity#setContentView(int) setContentView()}, passando
129o ID de recurso do layout. No entanto, também é possível criar novas {@link android.view.View}s
130no código da atividade e compilar uma hierarquia de vistas inserindo novas {@link
131android.view.View}s em um {@link android.view.ViewGroup} e, em seguida, usar esse layout passando a raiz
132{@link android.view.ViewGroup} para {@link android.app.Activity#setContentView(View)
133setContentView()}.</p>
134
135<p>Para obter mais informações sobre a criação de uma interface do usuário, consulte a documentação <a href="{@docRoot}guide/topics/ui/index.html">Interface do Usuário</a>.</p>
136
137
138
139<h3 id="Declaring">Declaração de uma atividade no manifesto</h3>
140
141<p>É preciso declarar a atividade no arquivo de manifesto para torná-la
142acessível para o sistema. Para declarar a atividade, abra o arquivo de manifesto e adicione um elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
143como filho do elemento
144<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code &lt;application&gt;}</a>. Por exemplo:</p>
145
146<pre>
147&lt;manifest ... &gt;
148  &lt;application ... &gt;
149      &lt;activity android:name=".ExampleActivity" /&gt;
150      ...
151  &lt;/application ... &gt;
152  ...
153&lt;/manifest &gt;
154</pre>
155
156<p>Existem outros atributos que podem ser incluídos nesse elemento para definir propriedades
157como o rótulo da atividade, um ícone para a atividade ou um tema para estilizar a IU da atividade.
158 O atributo <a href="{@docRoot}guide/topics/manifest/activity-element.html#nm">{@code android:name}</a>
159 é o único atributo obrigatório &mdash; ele especifica o nome de classe da atividade. Depois
160de publicar o aplicativo, não se deve alterar-lhe o nome porque, se isso acontecer, podem ocorrer danos
161em algumas funcionalidades, como os atalhos do aplicativo (leia a publicação do blogue <a href="http://android-developers.blogspot.com/2011/06/things-that-cannot-change.html">Coisas
162que não podem mudar</a>).</p>
163
164<p>Consulte a referência do elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code &lt;activity&gt;}</a>
165para obter mais informações sobre como declarar a atividade no manifesto.</p>
166
167
168<h4>Uso de filtros de intenções</h4>
169
170<p>Um elemento <a href="{@docRoot}guide/topics/manifest/activity-element.html">{@code
171&lt;activity&gt;}</a> também pode especificar vários filtros de intenções &mdash; usando o elemento <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
172&lt;intent-filter&gt;}</a> &mdash; para declarar o modo com que os componentes de aplicativo
173podem ativá-lo.</p>
174
175<p>Ao criar um novo aplicativo com as ferramentas do Android SDK, o esboço da atividade
176criado contém automaticamente um filtro de intenção que declara que a atividade responde
177à ação "main" (principal) e deve ser colocada na categoria "launcher” (inicializador). O filtro de intenção
178tem a seguinte aparência:</p>
179
180<pre>
181&lt;activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"&gt;
182    &lt;intent-filter&gt;
183        &lt;action android:name="android.intent.action.MAIN" /&gt;
184        &lt;category android:name="android.intent.category.LAUNCHER" /&gt;
185    &lt;/intent-filter&gt;
186&lt;/activity&gt;
187</pre>
188
189<p>O elemento <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code
190&lt;action&gt;}</a> especifica que este é o “principal” ponto de entrada do aplicativo. O elemento <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code
191&lt;category&gt;}</a> especifica que essa atividade deve ser listada no inicializador do aplicativo
192do sistema (para permitir que os usuários iniciem essa atividade).</p>
193
194<p>Se pretende-se que o aplicativo seja autônomo e que não permita que outros aplicativos ativem
195suas atividades, não será necessário nenhum outro filtro de intenção. Só uma atividade deve ter
196a ação "main" e a categoria "launcher", como no exemplo anterior. As atividades
197que não devem estar disponíveis a outros aplicativos não devem ter filtros de intenção, já que é possível
198iniciá-las por meio de intenções explícitas (conforme discutido na seção a seguir).</p>
199
200<p>No entanto, se a atividade deve responder a intenções implícitas derivadas de outros aplicativos
201(e do aplicativo em questão), é preciso definir filtros de intenções adicionais
202para a atividade. Para cada tipo de intenção que deve responder, é preciso incluir um <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code
203&lt;intent-filter&gt;}</a> que contenha um elemento
204<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code
205&lt;action&gt;}</a> e, opcionalmente, um elemento <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code
206&lt;category&gt;}</a> e/ou um elemento <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code
207&lt;data&gt;}</a>. Esses elementos especificam o tipo de intenção a que a atividade pode
208responder.</p>
209
210<p>Para obter mais informações sobre a forma com que as atividades podem responder a intenções, consulte o documento
211<a href="{@docRoot}guide/components/intents-filters.html">Intenções e filtros de intenções</a>.</p>
212
213
214
215<h2 id="StartingAnActivity">Início de uma atividade</h2>
216
217<p>Para iniciar outra atividade, é possível chamar {@link android.app.Activity#startActivity
218startActivity()} passando uma {@link android.content.Intent} que descreva a atividade
219que se deseja iniciar. A intenção especifica a atividade exata que deve ser iniciada ou descreve o tipo
220de ação que ela deve executar (e o sistema seleciona a atividade adequada,
221que
222pode ser até de um outro aplicativo). Uma intenção também pode portar pequenas quantidades de dados
223a serem usados pela atividade iniciada.</p>
224
225<p>Ao trabalhar no aplicativo, frequentemente será necessário iniciar uma atividade conhecida.
226 Para isso, pode-se criar uma intenção que defina explicitamente a atividade que deve ser iniciada
227por meio de um nome de classe. Por exemplo, a seguir é demonstrado como uma atividade inicia outra atividade de nome {@code
228SignInActivity}:</p>
229
230<pre>
231Intent intent = new Intent(this, SignInActivity.class);
232startActivity(intent);
233</pre>
234
235<p>No entanto, o aplicativo também pode ter que executar algumas ações, como enviar um e-mail,
236mensagem de texto ou atualização de status usando os dados da atividade em questão. Nesse caso, o aplicativo
237pode não ter suas próprias atividades para executar tais ações; para isso, pode-se aproveitar as atividades
238fornecidas por outros aplicativos do dispositivo que podem executar essas ações. Esses são os casos
239em que as intenções são muito importantes &mdash; é possível criar uma intenção que descreva
240uma ação a executar para que o sistema
241inicie a atividade apropriada de outro aplicativo. Se houver
242mais de uma atividade que possa manipular a intenção, o usuário poderá escolher qual usará. Por exemplo:
243 se quiser que o usuário envie uma mensagem de e-mail, é possível criar
244a seguinte intenção:</p>
245
246<pre>
247Intent intent = new Intent(Intent.ACTION_SEND);
248intent.putExtra(Intent.EXTRA_EMAIL, recipientArray);
249startActivity(intent);
250</pre>
251
252<p>O {@link android.content.Intent#EXTRA_EMAIL} adicionado à intenção é uma matriz de sequência
253de endereços de e-mail para os quais o e-mail poderá ser enviado. Quando um aplicativo de e-mail responde à essa intenção,
254ele lê a matriz de sequência fornecida no extra e a coloca no campo "para"
255do formulário de composição do e-mail. Nessa situação, a atividade do aplicativo de e-mail inicia e, quando o usuário termina o trabalho,
256sua atividade é retomada.</p>
257
258
259
260
261<h3 id="StartingAnActivityForResult">Início de uma atividade para um resultado</h3>
262
263<p>Às vezes, é necessário receber um resultado de alguma atividade iniciada. Nesse caso,
264 inicie a atividade chamando {@link android.app.Activity#startActivityForResult
265startActivityForResult()} (em vez de {@link android.app.Activity#startActivity
266 startActivity()}). Para receber o resultado de uma atividade
267subsequente, implemente o método de retorno de chamada
268{@link android.app.Activity#onActivityResult onActivityResult()}. Quando a atividade subsequente estiver concluída, ela retornará um resultado em uma {@link
269android.content.Intent} para o método
270{@link android.app.Activity#onActivityResult onActivityResult()}.</p>
271
272<p>Por exemplo, talvez você queira que o usuário escolha um dos contatos dele, deste modo, a atividade poderá
273fazer algo com as informações naquele contato. A seguir expõe-se como criar uma intenção desse tipo
274e manipular o resultado:</p>
275
276<pre>
277private void pickContact() {
278    // Create an intent to "pick" a contact, as defined by the content provider URI
279    Intent intent = new Intent(Intent.ACTION_PICK, Contacts.CONTENT_URI);
280    startActivityForResult(intent, PICK_CONTACT_REQUEST);
281}
282
283&#64;Override
284protected void onActivityResult(int requestCode, int resultCode, Intent data) {
285    // If the request went well (OK) and the request was PICK_CONTACT_REQUEST
286    if (resultCode == Activity.RESULT_OK &amp;&amp; requestCode == PICK_CONTACT_REQUEST) {
287        // Perform a query to the contact's content provider for the contact's name
288        Cursor cursor = getContentResolver().query(data.getData(),
289        new String[] {Contacts.DISPLAY_NAME}, null, null, null);
290        if (cursor.moveToFirst()) { // True if the cursor is not empty
291            int columnIndex = cursor.getColumnIndex(Contacts.DISPLAY_NAME);
292            String name = cursor.getString(columnIndex);
293            // Do something with the selected contact's name...
294        }
295    }
296}
297</pre>
298
299<p>Esse exemplo mostra a lógica básica que deve ser usada no método {@link
300android.app.Activity#onActivityResult onActivityResult()} para manipular
301o resultado de uma atividade. A primeira condição verifica se a solicitação foi bem-sucedida &mdash; se for,
302o {@code resultCode} será {@link android.app.Activity#RESULT_OK} &mdash; e se a solicitação
303a que esse resultado responderá for desconhecida &mdash;, nesse caso, o {@code requestCode} corresponderá
304ao segundo parâmetro com {@link android.app.Activity#startActivityForResult
305startActivityForResult()}. A partir daí, o código manipula o resultado da atividade com uma consulta
306dos dados retornados em uma {@link android.content.Intent} (o parâmetro {@code data}).</p>
307
308<p>Nesse momento, um {@link
309android.content.ContentResolver} executa uma consulta em um provedor de conteúdo, que retorna
310um {@link android.database.Cursor} que permite a leitura dos dados consultados. Para obter mais informações,
311consulte o documento <a href="{@docRoot}guide/topics/providers/content-providers.html">Provedores de conteúdo</a>.</p>
312
313<p>Para obter mais informações sobre intenções, consulte o documento
314<a href="{@docRoot}guide/components/intents-filters.html">Intenções e filtros de intenções</a>.</p>
315
316
317<h2 id="ShuttingDown">Encerramento de uma atividade</h2>
318
319<p>Para encerrar uma atividade, chame o método {@link android.app.Activity#finish
320finish()}. Também é possível encerrar uma atividade separada iniciada anteriormente chamando
321{@link android.app.Activity#finishActivity finishActivity()}.</p>
322
323<p class="note"><strong>Observação:</strong> na maioria dos casos, não se deve finalizar explicitamente
324uma atividade usando esses métodos. Conforme discutido na seção anterior sobre o ciclo de vida da atividade,
325o sistema Android gerencia a vida de uma atividade, portanto não é necessário finalizar
326as atividades. Chamar esses métodos poderia afetar negativamente a experiência
327do usuário esperada e isso só deve ser usado quando realmente não se desejar que o usuário
328retorne a essa instância da atividade.</p>
329
330
331<h2 id="Lifecycle">Gerenciamento do ciclo de vida da atividade</h2>
332
333<p>O gerenciamento do ciclo de vida das atividades por meio da implementação
334de métodos de retorno de chamada
335é essencial para desenvolver um aplicativo flexível. O ciclo de vida de uma atividade é diretamente afetado
336por sua associação a outras atividades, sua tarefa e sua pilha de retorno.</p>
337
338<p>Uma atividade pode existir essencialmente em três estados:</p>
339
340<dl>
341  <dt><i>Retomada</i></dt>
342    <dd>A atividade está em primeiro plano na tela e tem o foco do usuário (em geral,
343chama-se esse estado de "em execução”).</dd>
344
345  <dt><i>Pausada</i></dt>
346    <dd>A atividade ainda está visível, mas outra atividade está em primeiro plano e tem o foco. Ou seja,
347outra atividade está visível por cima desta e está parcialmente transparente
348ou não cobre inteiramente a tela. Uma atividade pausada está totalmente ativa (o objeto
349{@link android.app.Activity} está retido na memória, mantém todas as informações de estado e do membro e permanece anexado
350ao gerenciador de janela), mas pode ser eliminada pelo sistema em situações de memória extremamente baixa.</dd>
351
352  <dt><i>Interrompida</i></dt>
353    <dd>A atividade está totalmente suplantada por outra (a atividade passa para
354"segundo plano"). Uma atividade interrompida ainda está ativa (o objeto
355{@link android.app.Activity} está retido na memória, mantém todas as informações de estado e do membro, mas <em>não</em> está
356anexado ao gerenciador de janelas). No entanto, ela não fica mais visível para o usuário
357e pode ser eliminada pelo sistema se a memória for necessária em outro processo.</dd>
358</dl>
359
360<p>Se uma atividade estiver pausada ou interrompida, o sistema poderá descartá-la da memória solicitando a
361finalização do processo (chamando seu método {@link android.app.Activity#finish finish()}) ou simplesmente
362eliminando-o.  Quando a atividade for reaberta (depois de finalizada ou eliminada), ele deverá ser
363totalmente recriada.</p>
364
365
366
367<h3 id="ImplementingLifecycleCallbacks">Implementação de retornos de chamada do ciclo de vida</h3>
368
369<p>Quando uma atividade transita entre os diferentes estados descritos acima, ela é notificada
370por meio de vários métodos de retorno de chamada. Todos os métodos de retorno de chamada são ganchos
371que podem ser substituídos para executar um trabalho adequado quando o estado da atividade muda. O esqueleto de atividade
372a seguir contém cada um dos métodos do ciclo de vida fundamentais:</p>
373
374
375<pre>
376public class ExampleActivity extends Activity {
377    &#64;Override
378    public void {@link android.app.Activity#onCreate onCreate}(Bundle savedInstanceState) {
379        super.onCreate(savedInstanceState);
380        // The activity is being created.
381    }
382    &#64;Override
383    protected void {@link android.app.Activity#onStart onStart()} {
384        super.onStart();
385        // The activity is about to become visible.
386    }
387    &#64;Override
388    protected void {@link android.app.Activity#onResume onResume()} {
389        super.onResume();
390        // The activity has become visible (it is now "resumed").
391    }
392    &#64;Override
393    protected void {@link android.app.Activity#onPause onPause()} {
394        super.onPause();
395        // Another activity is taking focus (this activity is about to be "paused").
396    }
397    &#64;Override
398    protected void {@link android.app.Activity#onStop onStop()} {
399        super.onStop();
400        // The activity is no longer visible (it is now "stopped")
401    }
402    &#64;Override
403    protected void {@link android.app.Activity#onDestroy onDestroy()} {
404        super.onDestroy();
405        // The activity is about to be destroyed.
406    }
407}
408</pre>
409
410<p class="note"><strong>Observação:</strong> a implementação desses métodos do ciclo de vida
411deve sempre chamar a implementação da superclasse antes de realizar qualquer trabalho, conforme ilustrado no exemplo acima.</p>
412
413<p>Juntos, esses métodos definem todo o ciclo de vida da atividade. Ao implementá-los,
414é possível monitorar três loops aninhados no ciclo de vida da atividade: </p>
415
416<ul>
417<li><b>Todo o tempo de vida</b> de uma atividade acontece entre a chamada de {@link
418android.app.Activity#onCreate onCreate()} e a chamada de {@link
419android.app.Activity#onDestroy}. A atividade deve executar configuração
420de estado "global" (como definindo layout) em {@link android.app.Activity#onCreate onCreate()}
421e liberar todos os recursos restantes em {@link android.app.Activity#onDestroy}. Por exemplo: se a sua atividade
422tiver um encadeamento em execução em segundo plano para baixar dados da rede, ela pode
423criá-lo em {@link android.app.Activity#onCreate onCreate()} e, em seguida, interrompê-lo em {@link
424android.app.Activity#onDestroy}.</li>
425
426<li><p>O <b>tempo de vida visível</b> de uma atividade acontece entre a chamada de {@link
427android.app.Activity#onStart onStart()} e a chamada de {@link
428android.app.Activity#onStop onStop()}. Durante esse tempo, o usuário pode ver a atividade
429na tela e interagir com ela. Por exemplo: {@link android.app.Activity#onStop onStop()} é chamado
430quando uma nova atividade inicia e esta não fica mais visível. Entre esses dois métodos, é possível
431manter os recursos necessários para exibir a atividade ao usuário. Por exemplo: você pode registrar
432um {@link android.content.BroadcastReceiver} em {@link
433android.app.Activity#onStart onStart()} para monitorar as alterações que afetem a IU e cancelar o registro
434 em {@link android.app.Activity#onStop onStop()} quando o usuário não puder mais ver
435o que você está exibindo. O sistema pode chamar {@link android.app.Activity#onStart onStart()} e {@link
436android.app.Activity#onStop onStop()} várias vezes durante todo o tempo de vida de uma atividade
437enquanto ela alterna entre visível e oculta ao usuário.</p></li>
438
439<li><p>O <b>tempo de vida em primeiro plano</b> de uma atividade ocorre entre a chamada de {@link
440android.app.Activity#onResume onResume()} e a chamada de {@link android.app.Activity#onPause
441onPause()}. Durante esse tempo, a atividade está na frente de todas as outras atividades na tela
442e tem o foco de interação do usuário.  Frequentemente, uma atividade pode transitar entre o primeiro e
443o segundo plano &mdash; por exemplo, {@link android.app.Activity#onPause onPause()} é chamado quando o dispositivo está em suspensão
444ou quando uma caixa de diálogo é exibida. Como esse estado pode transitar frequentemente, o código nesses dois métodos deve
445ser bem leve para evitar transições lentas que façam o usuário esperar.</p></li>
446</ul>
447
448<p>A figura 1 ilustra esses loops e os caminhos que uma atividade pode tomar entre os estados.
449Os retângulos representam os métodos de retorno de chamada que podem ser implementados para executar operações
450quando a atividade transita entre estados. <p>
451
452<img src="{@docRoot}images/activity_lifecycle.png" alt="" />
453<p class="img-caption"><strong>Figura 1.</strong> Ciclo de vida da atividade.</p>
454
455<p>Os mesmos métodos de retorno de chamada do ciclo de vida são listados na tabela 1, que descreve cada um deles
456em mais detalhes e localiza cada um dentro
457do ciclo de vida geral da atividade, inclusive se o sistema puder eliminar a atividade depois
458da conclusão do método de retorno de chamada.</p>
459
460<p class="table-caption"><strong>Tabela 1.</strong> Resumo dos métodos de retorno de chamada
461do ciclo de vida da atividade.</p>
462
463<table border="2" width="85%" frame="hsides" rules="rows">
464<colgroup align="left" span="3"></colgroup>
465<colgroup align="left"></colgroup>
466<colgroup align="center"></colgroup>
467<colgroup align="center"></colgroup>
468
469<thead>
470<tr><th colspan="3">Método</th> <th>Descrição</th> <th>Eliminável depois de?</th> <th>Próximo</th></tr>
471</thead>
472
473<tbody>
474<tr>
475  <td colspan="3" align="left"><code>{@link android.app.Activity#onCreate onCreate()}</code></td>
476  <td>Chamado quando a atividade é criada pela primeira vez.
477      É quando deve-se fazer toda a configuração estática normal &mdash;
478criar vistas, vincular dados a listas etc.  Esse método recebe
479um objeto Bundle (pacote) contendo o estado anterior da atividade, se esse
480estado for capturado (consulte <a href="#actstate">Gravação do estado da atividade</a>
481mais adiante).
482      <p>Sempre seguido de {@code onStart()}.</p></td>
483  <td align="center">Não</td>
484      <td align="center">{@code onStart()}</td>
485</tr>
486
487<tr>
488   <td rowspan="5" style="border-left: none; border-right: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
489   <td colspan="2" align="left"><code>{@link android.app.Activity#onRestart
490onRestart()}</code></td>
491   <td>Chamado depois que atividade tiver sido interrompida, logo antes de ser
492reiniciada.
493       <p>Sempre seguido de {@code onStart()}.</p></td>
494   <td align="center">Não</td>
495   <td align="center">{@code onStart()}</td>
496</tr>
497
498<tr>
499   <td colspan="2" align="left"><code>{@link android.app.Activity#onStart onStart()}</code></td>
500   <td>Chamado logo antes de a atividade se tornar visível ao usuário.
501       <p>Seguido de {@code onResume()} se a atividade
502for para segundo plano ou {@code onStop()} se ficar oculta.</p></td>
503    <td align="center">Não</td>
504    <td align="center">{@code onResume()} <br/>ou<br/> {@code onStop()}</td>
505</tr>
506
507<tr>
508   <td rowspan="2" style="border-left: none;">&nbsp;&nbsp;&nbsp;&nbsp;</td>
509   <td align="left"><code>{@link android.app.Activity#onResume onResume()}</code></td>
510   <td>Chamado logo antes de a atividade iniciar
511a interação com o usuário.  Nesse ponto, a atividade estará
512no topo da pilha de atividades com a entrada do usuário direcionada a ela.
513       <p>Sempre seguido de {@code onPause()}.</p></td>
514   <td align="center">Não</td>
515   <td align="center">{@code onPause()}</td>
516</tr>
517
518<tr>
519   <td align="left"><code>{@link android.app.Activity#onPause onPause()}</code></td>
520   <td>Chamado quando o sistema está prestes a retomar
521outra atividade.  Esse método normalmente é usado para confirmar alterações
522não salvas a dados persistentes, animações interrompidas e outras coisas que talvez
523estejam consumindo CPU e assim por diante.  Ele sempre deve fazer tudo bem rapidamente porque
524a próxima atividade não será retomada até ela retornar.
525       <p>Seguido de {@code onResume()} se a atividade
526retornar para a frente ou de {@code onStop()} se ficar
527invisível ao usuário.</td>
528   <td align="center"><strong style="color:#800000">Sim</strong></td>
529   <td align="center">{@code onResume()} <br/>ou<br/> {@code onStop()}</td>
530</tr>
531
532<tr>
533   <td colspan="2" align="left"><code>{@link android.app.Activity#onStop onStop()}</code></td>
534   <td>Chamado quando a atividade não está mais visível ao usuário.  Isso
535pode acontecer porque ela está sendo destruída ou porque outra atividade
536(uma existente ou uma nova) foi retomada e está cobrindo-a.
537       <p>Seguido de {@code onRestart()} se a atividade
538estiver voltando a interagir com o usuário
539ou {@code onDestroy()} se estiver saindo.</p></td>
540   <td align="center"><strong style="color:#800000">Sim</strong></td>
541   <td align="center">{@code onRestart()} <br/>ou<br/> {@code onDestroy()}</td>
542</tr>
543
544<tr>
545   <td colspan="3" align="left"><code>{@link android.app.Activity#onDestroy
546onDestroy()}</code></td>
547   <td>Chamado antes de a atividade ser destruída.  É a última chamada
548que a atividade receberá.  Pode ser chamado porque a atividade
549está finalizando (alguém chamou <code>{@link android.app.Activity#finish
550       finish()}</code> nela) ou porque o sistema está destruindo temporariamente essa instância
551da atividade para poupar espaço.  É possível distinguir
552entre essas duas situações com o método <code>{@link
553       android.app.Activity#isFinishing isFinishing()}</code>.</td>
554   <td align="center"><strong style="color:#800000">Sim</strong></td>
555   <td align="center"><em>nada</em></td>
556</tr>
557</tbody>
558</table>
559
560<p>A coluna de nome "Eliminável depois de?" indica se o sistema pode ou não
561eliminar o processo que hospeda a atividade a qualquer momento <em>após o método retornar</em>
562sem executar outra linha de código da atividade.  Estes três métodos são marcados como "sim": ({@link
563android.app.Activity#onPause
564onPause()}, {@link android.app.Activity#onStop onStop()} e {@link android.app.Activity#onDestroy
565onDestroy()}). Como {@link android.app.Activity#onPause onPause()} é o primeiro
566dos três, assim que a atividade é criada, {@link android.app.Activity#onPause onPause()} é
567o último método que certamente será chamado antes que o processo <em>possa</em> ser eliminado &mdash;
568se o sistema precisar recuperar memória em uma emergência, {@link
569android.app.Activity#onStop onStop()} e {@link android.app.Activity#onDestroy onDestroy()} poderão
570não ser chamados. Portanto, deve-se usar {@link android.app.Activity#onPause onPause()} para gravar
571dados persistentes cruciais (como edições do usuário) no armazenamento. No entanto, deve-se sempre ser seletivo
572acerca das informações que devem ser retidas durante {@link android.app.Activity#onPause onPause()} porque
573qualquer procedimento de bloqueio nesse método bloqueará a transição para a próxima atividade e retardará
574a experiência do usuário.</p>
575
576<p> Os métodos marcados como "Não" na coluna <b>Elimináveis</b> protegem o processo que hospeda
577a atividade. evitando a eliminação dele no momento em que é chamado.  Assim, uma atividade é eliminável
578do momento em que {@link android.app.Activity#onPause onPause()} retorna ao momento em que
579{@link android.app.Activity#onResume onResume()} é chamado. Ela não será eliminável novamente até que
580{@link android.app.Activity#onPause onPause()} seja chamado e retorne novamente. </p>
581
582<p class="note"><strong>Observação:</strong> uma atividade tecnicamente não "eliminável”, por essa definição
583na tabela 1, ainda pode ser eliminada pelo sistema &mdash; mas isso só ocorreria
584em circunstâncias extremas, quando não houvesse outra opção. A possibilidade de uma atividade ser eliminada
585é discutida em mais detalhes no documento <a href="{@docRoot}guide/components/processes-and-threads.html">Processos
586e encadeamentos</a>.</p>
587
588
589<h3 id="SavingActivityState">Gravação do estado da atividade</h3>
590
591<p>A introdução a <a href="#Lifecycle">Gerenciamento do ciclo de vida da atividade</a> menciona brevemente
592que,
593quando uma atividade é pausada ou interrompida, o estado da atividade é retido. Isso acontece porque
594o objeto {@link android.app.Activity} continua mantido na memória quando a atividade está pausada
595ou interrompida &mdash; todas as informações sobre seus membros e estado atual ainda estão ativas. Assim, todas as alterações
596feitas pelo usuário dentro da atividade são retidas, de forma que, quando a atividade retornar
597ao primeiro plano (quando é "retomada"), essas alterações ainda estejam lá.</p>
598
599<p>No entanto, quando o sistema destrói uma atividade para recuperar memória, o objeto {@link
600android.app.Activity} é destruído, por isso o sistema não pode simplesmente retomá-la com seu estado
601intacto. Em vez disso, o sistema tem que recriar o objeto {@link android.app.Activity} se o usuário
602navegar de volta a ele. Ainda assim, o usuário não estará ciente
603de que o sistema destruiu a atividade e recriou-a e, assim, provavelmente
604esperará que a atividade esteja exatamente como antes. Nessa situação, para garantir que
605as informações importantes sobre o estado da atividade sejam preservadas, implementa-se um método
606adicional de retorno de chamada que permite salvar as informações sobre o estado da atividade: {@link
607android.app.Activity#onSaveInstanceState onSaveInstanceState()}.</p>
608
609<p>O sistema chama {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
610antes de deixar a mensagem vulnerável à destruição. O sistema passa a esse método
611um {@link android.os.Bundle} no qual é possível salvar
612informações de estado acerca da atividade, como pares nome-valor, usando métodos como {@link
613android.os.Bundle#putString putString()} e {@link
614android.os.Bundle#putInt putInt()}. Em seguida, se o sistema eliminar o processo
615do aplicativo e o usuário voltar à atividade, o sistema recriará a atividade e passará
616o {@link android.os.Bundle} a {@link android.app.Activity#onCreate onCreate()} e a {@link
617android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}. Usando qualquer um desses métodos,
618é possível extrair o estado salvo de {@link android.os.Bundle} e restaurar
619o estado da atividade. Se não houver informações de estado a restaurar, o {@link
620android.os.Bundle} passado será nulo (que é o caso quando a atividade é criada
621pela primeira vez).</p>
622
623<img src="{@docRoot}images/fundamentals/restore_instance.png" alt="" />
624<p class="img-caption"><strong>Figura 2.</strong> As duas formas pelas quais uma atividade retorna ao foco
625do usuário com seu estado intacto: ou a atividade é destruída e recriada em seguida — e ela deve restaurar
626o estado salvo anteriormente —, ou a atividade é interrompida e retomada em seguida — e o estado dela
627permanece intacto.</p>
628
629<p class="note"><strong>Observação:</strong> não há garantia nenhuma de que {@link
630android.app.Activity#onSaveInstanceState onSaveInstanceState()} será chamado antes de a atividade
631ser destruída porque há casos em que não será necessário salvar o estado
632(como quando o usuário sai da atividade usando o botão <em>Voltar</em>) porque o usuário está fechando
633explicitamente
634a atividade). Se o sistema chamar {@link android.app.Activity#onSaveInstanceState
635onSaveInstanceState()}, ele o fará antes de {@link
636android.app.Activity#onStop onStop()} e possivelmente antes de {@link android.app.Activity#onPause
637onPause()}.</p>
638
639<p>No entanto, mesmo se você não fizer nada e não implementar {@link
640android.app.Activity#onSaveInstanceState onSaveInstanceState()}, parte do estado da atividade
641será restaurada pela implementação padrão da classe {@link android.app.Activity} de {@link
642android.app.Activity#onSaveInstanceState onSaveInstanceState()}. Especificamente, a implementação
643padrão chama o método {@link
644android.view.View#onSaveInstanceState onSaveInstanceState()} correspondente para cada {@link
645android.view.View} no layout, o que permite que cada vista forneça informações próprias sobre o que
646deve ser salvo. Quase todo widget na estrutura do Android implementa esse método
647conforme o necessário, de forma que qualquer alteração visível na IU seja automaticamente salva e restaurada
648ao criar a atividade. Por exemplo, o widget {@link android.widget.EditText} salva qualquer texto
649inserido pelo usuário e o widget {@link android.widget.CheckBox} salva independente
650de verificação. O único trabalho necessário será fornecer um ID exclusivo (com
651o atributo <a href="{@docRoot}guide/topics/resources/layout-resource.html#idvalue">{@code android:id}</a>) para cada widget que for salvar seu estado. Se o widget não salvar nenhum ID, o sistema
652não poderá salvar seu estado.</p>
653
654<div class="sidebox-wrapper">
655<div class="sidebox">
656<p>Para fazer com que uma vista deixe explicitamente de salvar seu estado, defina o atributo
657{@link android.R.attr#saveEnabled android:saveEnabled} como {@code "false"} ou chame
658o método {@link android.view.View#setSaveEnabled setSaveEnabled()}. Geralmente, não se deve
659desativar isso, mas é possível caso se deseje restaurar o estado da IU da atividade de forma diferente.</p>
660</div>
661</div>
662
663<p>Embora a implementação padrão de {@link
664android.app.Activity#onSaveInstanceState onSaveInstanceState()} salve informações úteis sobre
665a IU da atividade, talvez ainda seja necessário substituí-la para salvar informações adicionais.
666Por exemplo: pode ser necessário salvar valores de membro alterados durante a vida da atividade (possivelmente
667correlacionados a valores restaurados na IU, mas os membros que retêm esses valores de IU, por padrão,
668não são restaurados).</p>
669
670<p>Como a implementação padrão de {@link
671android.app.Activity#onSaveInstanceState onSaveInstanceState()} ajuda a salvar o estado da IU,
672se o método for substituído para salvar informações de estado adicionais, deve-se sempre chamar a implementação
673da superclasse de {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}
674antes de fazer qualquer trabalho. Da mesma forma, deve-se também chamar a implementação da superclasse de {@link
675android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} se ela for substituída para que
676a implementação padrão possa restaurar estados da vista.</p>
677
678<p class="note"><strong>Observação:</strong> Como nem sempre {@link android.app.Activity#onSaveInstanceState
679onSaveInstanceState()} é chamado,
680deve-se usá-lo somente para registrar o estado temporário da atividade (o estado
681da IU) &mdash; nunca se deve usá-lo para armazenar dados persistentes.  Em vez disso, deve-se usar {@link
682android.app.Activity#onPause onPause()} para armazenar dados persistentes (como dados que devem ser salvos
683em um banco de dados) quando o usuário sair da atividade.</p>
684
685<p>Uma boa forma de testar a capacidade do aplicativo de restaurar seu estado é girar
686o dispositivo para alterar a orientação da tela. Quando a orientação de tela muda, o sistema
687destrói e recria a atividade para aplicar recursos alternativos que podem ser disponibilizados
688para a nova configuração de tela. Por esse motivo somente, é muito importante que a atividade
689restaure completamente seu estado quando for recriada porque os usuários normalmente giram a tela
690ao usar aplicativos.</p>
691
692
693<h3 id="ConfigurationChanges">Manipulação de alterações de configuração</h3>
694
695<p>Algumas configurações do dispositivo podem mudar em tempo de execução (como A orientação da tela, disponibilidade
696do teclado e idioma). Quando ocorre uma alteração, o Android recria a atividade em execução
697(o sistema chama {@link android.app.Activity#onDestroy} e, em seguida, chama {@link
698android.app.Activity#onCreate onCreate()} imediatamente). Esse comportamento foi projetado
699para ajudar o aplicativo a se adaptar a novas configurações recarregando-o automaticamente
700com recursos alternativos fornecidos pelo programador (como diferentes layouts
701para orientações e tamanhos de telas diferentes).</p>
702
703<p>Se você projetar adequadamente a atividade para manipular um reinício devido a uma alteração na orientação da tela
704e restaurar o estado da atividade conforme descrito acima, o aplicativo será mais resiliente a outros
705eventos inesperados no ciclo de vida da atividade.</p>
706
707<p>A melhor forma de manipular um reinício desse tipo
708é salvar e restaurar o estado da atividade com {@link
709 android.app.Activity#onSaveInstanceState onSaveInstanceState()} e {@link
710android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} (ou com {@link
711android.app.Activity#onCreate onCreate()}), conforme abordado na seção anterior.</p>
712
713<p>Para obter mais informações sobre alterações de configuração que podem ocorrer em tempo de execução e como manipulá-las,
714leia o guia em <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Tratamento de
715alterações em tempo de execução</a>.</p>
716
717
718
719<h3 id="CoordinatingActivities">Coordenação de atividades</h3>
720
721 <p>Quando uma atividade inicia outra, ambas passam por transições no ciclo de vida. A primeira atividade
722é pausada e interrompida (embora ela não seja interrompida se ainda estiver visível em segundo plano) enquanto a outra
723atividade é criada. Caso essas atividades compartilhem dados salvos em disco ou em outro lugar, é importante
724compreender que a primeira atividade não é totalmente interrompida antes da criação da segunda.
725Em vez disso, o processo de iniciar a segunda se sobrepõe ao processo de interromper
726a primeira.</p>
727
728<p>A ordem dos retornos de chamada do ciclo de vida é bem definida, especialmente quando as duas atividades estão
729no mesmo processo e uma está iniciando a outra. A seguir há a ordem das operações que ocorrem quando a atividade A
730inicia a atividade B: </p>
731
732<ol>
733<li>O método {@link android.app.Activity#onPause onPause()} da atividade A é executado.</li>
734
735<li>Os métodos {@link android.app.Activity#onCreate onCreate()}, {@link
736android.app.Activity#onStart onStart()} e {@link android.app.Activity#onResume onResume()}
737da atividade B são executados em sequência (a atividade B agora tem o foco do usuário).</li>
738
739<li>Em seguida, se a atividade A não estiver mais visível na tela, seu método {@link
740android.app.Activity#onStop onStop()} é executado.</li>
741</ol>
742
743 <p>Essa sequência previsível de retornos de chamada do ciclo de vida permite gerenciar a transição
744de informações de uma atividade para outra. Por exemplo: se você for gravar em um banco de dados o momento em que
745a primeira atividade é interrompida para que a atividade a seguir possa lê-lo, é preciso realizar a gravação
746no banco de dados durante {@link android.app.Activity#onPause onPause()} e não durante {@link
747android.app.Activity#onStop onStop()}.</p>
748
749<!--
750<h2>Beginner's Path</h2>
751
752<p>For more information about how Android maintains a history of activities and
753enables user multitasking, continue with the <b><a
754href="{@docRoot}guide/components/tasks-and-back-stack.html">Tasks and Back
755Stack</a></b> document.</p>
756-->
757