1page.title=Recriando uma atividade 2page.tags=ciclo de vida da atividade 3helpoutsWidget=true 4 5trainingnavtop=true 6 7@jd:body 8 9<div id="tb-wrapper"> 10 <div id="tb"> 11 12 <h2>Esta lição ensina a</h2> 13 <ol> 14 <li><a href="#SaveState">Salvar o estado da atividade</a></li> 15 <li><a href="#RestoreState">Restaurar o estado da atividade</a></li> 16 </ol> 17 18 <h2>Leia também</h2> 19 <ul> 20 <li><a href="{@docRoot}training/basics/supporting-devices/screens.html">Compatibilidade 21 com diferentes telas</a></li> 22 <li><a href="{@docRoot}guide/topics/resources/runtime-changes.html">Tratar alterações no tempo de execução</a></li> 23 <li><a href="{@docRoot}guide/components/activities.html">Atividades</a> 24 </li> 25 </ul> 26 27 </div> 28</div> 29 30<p>Estas são algumas possibilidade onde a atividade é destruída devido ao comportamento normal do aplicativo, como 31quando o usuário pressiona o botão <em>Voltar</em> ou sua atividade sinaliza sua própria destruição 32chamando {@link android.app.Activity#finish()}. O sistema também pode destruir a atividade se 33for interrompida e não tiver sido utilizada por um longo período de tempo ou a atividade do primeiro plano exigir mais 34recursos, então, o sistema deverá fechar processos de segundo plano para recuperar memória.</p> 35 36<p>Quando a atividade é destruída porque o usuário pressiona <em>Voltar</em> ou a atividade se 37encerra, o conceito do sistema de que a instância {@link android.app.Activity} se perde 38porque o comportamento indica que a atividade já não é necessária. No entanto, se o sistema destruir 39a atividade devido a limitações do sistema (em vez do comportamento normal do aplicativo), embora a instância real 40{@link android.app.Activity} tenha se perdido, o sistema lembra que ela existiu de forma que se 41o usuário navegar de volta, o sistema criará uma nova instância da atividade usando um conjunto 42de dados salvos que descrevem o estado da atividade quando foi destruída. Os dados salvos 43utilizados pelo sistema para restaurar o estado anterior é chamado de “estado da instância” e é uma coleção 44de pares de valores-chave armazenados no objeto {@link android.os.Bundle}.</p> 45 46<p class="caution"><strong>Cuidado:</strong> a atividade é destruída e recriada cada vez 47que o usuário girar a tela. Quando a tela altera a orientação, o sistema destrói e recria 48a atividade de primeiro plano porque a configuração da tela mudou e a atividade talvez precise 49carregar recursos alternativos (como o layout).</p> 50 51<p>Por padrão, o sistema usa o estado da instância {@link android.os.Bundle} para salvar informações 52sobre cada objeto {@link android.view.View} em seu layout de atividade (como o valor do texto informado 53em um objeto {@link android.widget.EditText}). Assim, se a instância da atividade for destruída e 54recriada, o estado do layout é restaurado em seu estado anterior sem 55que haja necessidade de códigos. No entanto, sua 56atividade pode conter mais informações de estado do que se deseja restaurar, como varáveis de membro que 57rastreiam o progresso do usuário na atividade.</p> 58 59<p class="note"><strong>Observação:</strong> para que o sistema Android restaure o estado das 60visualizações em sua atividade, <strong>cada visualização precisa ter uma ID exclusiva</strong>, fornecido pelo atributo 61<a href="{@docRoot}reference/android/view/View.html#attr_android:id">{@code 62android:id}</a>.</p> 63 64<p>Para salvar dados adicionais sobre o estado da atividade, substitua 65o método de retorno de chamada {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}. 66O sistema chama este método quando o usuário sai da atividade 67e transmite o objeto{@link android.os.Bundle}, que será salvo 68caso a atividade seja destruída inesperadamente. Se 69o sistema precisar recriar a instância da atividade posteriormente, transmitirá o mesmo objeto {@link 70android.os.Bundle} para ambos os métodos {@link android.app.Activity#onRestoreInstanceState 71onRestoreInstanceState()} e {@link android.app.Activity#onCreate onCreate()} 72.</p> 73 74<img src="{@docRoot}images/training/basics/basic-lifecycle-savestate.png" /> 75<p class="img-caption"><strong>Figura 2.</strong> Conforme o sistema começa a interromper a atividade, ele 76chama {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()}(1) para que você possa especificar 77outros dados de estado que gostaria de salvar caso a instância {@link android.app.Activity} precise ser 78recriada. 79Se a atividade for destruída e a mesma instância precisar ser recriada, o sistema transmite os dados do 80estado definidos em (1) para ambos os métodos {@link android.app.Activity#onCreate onCreate()} 81(2) e {@link android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} 82(3).</p> 83 84 85 86<h2 id="SaveState">Salvar o estado da atividade</h2> 87 88<p>Conforme a atividade é interrompida, o sistema chama {@link android.app.Activity#onSaveInstanceState 89onSaveInstanceState()} para que a atividade possa salvar informações de estado com uma coleção de pares de 90valor-chave. A implementação padrão deste método salva informações sobre o estado da hierarquia de exibições 91da atividade, como o texto em um widget {@link android.widget.EditText} ou a posição de rolagem 92de um {@link android.widget.ListView}.</p> 93 94<p>Para salvar informações de estado adicionais para a atividade, 95implemente {@link android.app.Activity#onSaveInstanceState onSaveInstanceState()} e adicione 96pares de valor-chave ao objeto {@link android.os.Bundle}. Por exemplo:</p> 97 98<pre> 99static final String STATE_SCORE = "playerScore"; 100static final String STATE_LEVEL = "playerLevel"; 101... 102 103@Override 104public void onSaveInstanceState(Bundle savedInstanceState) { 105 // Save the user's current game state 106 savedInstanceState.putInt(STATE_SCORE, mCurrentScore); 107 savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel); 108 109 // Always call the superclass so it can save the view hierarchy state 110 super.onSaveInstanceState(savedInstanceState); 111} 112</pre> 113 114<p class="caution"><strong>Cuidado:</strong> sempre chame a implementação de superclasse de {@link 115android.app.Activity#onSaveInstanceState onSaveInstanceState()} para que a implementação padrão 116possa salvar o estado da hierarquia de exibições.</p> 117 118 119 120<h2 id="RestoreState">Restaurar o estado da atividade</h2> 121 122<p>Quando a atividade é recriada depois de ter sido destruída, é possível recuperar o estado 123salvo do {@link android.os.Bundle} que o sistema 124transmitiu a atividade. Ambos os métodos de retorno de chamada {@link android.app.Activity#onCreate onCreate()} e {@link 125android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} recebem 126o mesmo {@link android.os.Bundle} que contém informações do estado da instância.</p> 127 128<p>Como o método {@link android.app.Activity#onCreate onCreate()} é chamado se o 129sistema estiver criando uma nova instância da atividade ou recriando uma anterior, verifique 130se o {@link android.os.Bundle} do estado é null antes de tentar realizar a leitura. Se for null, 131o sistema estará criando uma nova instância da atividade em vez de restaurar uma anterior 132que tenha sido destruída.</p> 133 134<p>Por exemplo, esta é uma forma de restaurar alguns dados de estado no {@link android.app.Activity#onCreate 135onCreate()}:</p> 136 137<pre> 138@Override 139protected void onCreate(Bundle savedInstanceState) { 140 super.onCreate(savedInstanceState); // Always call the superclass first 141 142 // Check whether we're recreating a previously destroyed instance 143 if (savedInstanceState != null) { 144 // Restore value of members from saved state 145 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 146 mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 147 } else { 148 // Probably initialize members with default values for a new instance 149 } 150 ... 151} 152</pre> 153 154<p>Em vez de restaurar o estado durante {@link android.app.Activity#onCreate onCreate()}, você 155pode implementar {@link 156android.app.Activity#onRestoreInstanceState onRestoreInstanceState()}, que o sistema chama 157depois do método {@link android.app.Activity#onStart()}. O sistema chama {@link 158android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} se houver um estado 159salvo para ser restaurado. Portanto, não é necessário verificar se {@link android.os.Bundle} é null:</p> 160 161<pre> 162public void onRestoreInstanceState(Bundle savedInstanceState) { 163 // Always call the superclass so it can restore the view hierarchy 164 super.onRestoreInstanceState(savedInstanceState); 165 166 // Restore state members from saved instance 167 mCurrentScore = savedInstanceState.getInt(STATE_SCORE); 168 mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL); 169} 170</pre> 171 172<p class="caution"><strong>Cuidado:</strong> sempre chame a implementação de superclasse de {@link 173android.app.Activity#onRestoreInstanceState onRestoreInstanceState()} para que a implementação padrão 174possa restaurar o estado da hierarquia de exibições.</p> 175 176<p>Para saber mais sobre recriação de atividades devido a 177um evento de reinicialização no tempo de execução (como quando a tela gira), consulte <a href="{@docRoot}guide/topics/resources/runtime-changes.html">Tratar alterações no tempo de execução</a>.</p> 178 179