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&#64;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&#64;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