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 — quando o sistema a está criando, interrompendo, retomando ou destruindo — 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 — 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 <activity>}</a> 143como filho do elemento 144<a href="{@docRoot}guide/topics/manifest/application-element.html">{@code <application>}</a>. Por exemplo:</p> 145 146<pre> 147<manifest ... > 148 <application ... > 149 <activity android:name=".ExampleActivity" /> 150 ... 151 </application ... > 152 ... 153</manifest > 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 — 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 <activity>}</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<activity>}</a> também pode especificar vários filtros de intenções — usando o elemento <a href="{@docRoot}guide/topics/manifest/intent-filter-element.html">{@code 172<intent-filter>}</a> — 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<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon"> 182 <intent-filter> 183 <action android:name="android.intent.action.MAIN" /> 184 <category android:name="android.intent.category.LAUNCHER" /> 185 </intent-filter> 186</activity> 187</pre> 188 189<p>O elemento <a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 190<action>}</a> especifica que este é o “principal” ponto de entrada do aplicativo. O elemento <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 191<category>}</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<intent-filter>}</a> que contenha um elemento 204<a href="{@docRoot}guide/topics/manifest/action-element.html">{@code 205<action>}</a> e, opcionalmente, um elemento <a href="{@docRoot}guide/topics/manifest/category-element.html">{@code 206<category>}</a> e/ou um elemento <a href="{@docRoot}guide/topics/manifest/data-element.html">{@code 207<data>}</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 — é 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@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 && 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 — se for, 302o {@code resultCode} será {@link android.app.Activity#RESULT_OK} — e se a solicitação 303a que esse resultado responderá for desconhecida —, 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 @Override 378 public void {@link android.app.Activity#onCreate onCreate}(Bundle savedInstanceState) { 379 super.onCreate(savedInstanceState); 380 // The activity is being created. 381 } 382 @Override 383 protected void {@link android.app.Activity#onStart onStart()} { 384 super.onStart(); 385 // The activity is about to become visible. 386 } 387 @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 @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 @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 @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 — 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 — 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;"> </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;"> </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 — 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 — 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 — 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) — 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