• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Interrompendo e reiniciando 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="#Stop">Interromper sua atividade</a></li>
15      <li><a href="#Start">Iniciar/reiniciar sua atividade</a></li>
16    </ol>
17
18    <h2>Leia também</h2>
19    <ul>
20      <li><a href="{@docRoot}guide/components/activities.html">Atividades</a>
21      </li>
22    </ul>
23
24<h2>Tente</h2>
25
26<div class="download-box">
27 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">Baixar a demonstração</a>
28 <p class="filename">ActivityLifecycle.zip</p>
29</div>
30
31  </div>
32</div>
33
34<p>Interromper e reiniciar adequadamente sua atividade é um processo importante no ciclo de vida da atividade
35que garante que o usuário perceba que o aplicativo está sempre ativo e não perca o progresso.
36Há alguns cenários fundamentais em que sua atividade é interrompida e reiniciada:</p>
37
38<ul>
39  <li>O usuário abre a janela Aplicativos Utilizados Recentemente e alterna de um aplicativo a outro. A
40atividade em seu aplicativo atualmente em primeiro plano é interrompida. Se o usuário retornar ao
41aplicativo pelo ícone de inicialização da tela inicial ou da janela Aplicativos Utilizados Recentemente, a atividade é reiniciada.</li>
42  <li>O usuário executar uma ação em seu aplicativo que inicia uma nova atividade. A atividade atual
43é interrompida quando a segunda é criada. Se o usuário pressionar o botão <em>Voltar</em>
44, a primeira atividade será reiniciada.</li>
45  <li>Se o usuário receber uma chamada telefônica enquanto estiver usando o seu aplicativo.</li>
46</ul>
47
48<p>A classe {@link android.app.Activity} fornece dois métodos do ciclo de vida, {@link
49android.app.Activity#onStop()} e {@link android.app.Activity#onRestart()}, que permite que você
50decida exatamente como a atividade responderá à interrupção e reinicialização. Diferentemente do estado pausado,
51que identifica obstruções parciais da interface de usuário, o estado interrompido garante que a interface não fique
52visível e que o foco do usuário permaneça em outra atividade (ou mesmo outro aplicativo).</p>
53
54<p class="note"><strong>Observação:</strong> como o sistema retém a instância {@link android.app.Activity}
55na memória quando interrompida, talvez não seja necessário implementar os métodos
56{@link android.app.Activity#onStop()} e {@link android.app.Activity#onRestart()} (ou mesmo {@link
57android.app.Activity#onStart()}. Para a maioria das atividades que são relativamente simples, a
58atividade será interrompida e reiniciada normalmente e talvez seja necessário apenas usar {@link
59android.app.Activity#onPause()} para pausar ações em andamento e desconectar dos recursos do sistema.</p>
60
61<img src="{@docRoot}images/training/basics/basic-lifecycle-stopped.png" />
62<p class="img-caption"><strong>Figura 1.</strong> Quando o usuário sai da atividade, o sistema
63chama {@link android.app.Activity#onStop onStop()} para interrompê-la (1). Se o usuário retornar
64enquanto a atividade estiver interrompida, o sistema chama {@link android.app.Activity#onRestart onRestart()}
65(2), rapidamente seguido por {@link android.app.Activity#onStart onStart()} (3) e {@link
66android.app.Activity#onResume()} (4). Observe que independentemente do que tenha causado a interrupção
67da atividade, o sistema sempre chama {@link android.app.Activity#onPause onPause()} antes de chamar {@link
68android.app.Activity#onStop onStop()}.</p>
69
70
71
72<h2 id="Stop">Interromper sua atividade</h2>
73
74<p>Quando sua atividade recebe uma chamada para o método {@link android.app.Activity#onStop()}, não
75está mais visível e deve liberar quase todos os recursos que não foram necessários enquanto o usuário não
76estiver utilizando. Quando a atividade for interrompida, o sistema pode destruir a instância se for necessário para
77recuperar memória do sistema. Em casos extremos, o sistema pode simplesmente desligar o processo do aplicativo sem
78chamar o retorno de chamada{@link android.app.Activity#onDestroy()} final da atividade, portanto, é importante
79usar {@link android.app.Activity#onStop()} para liberar recursos que podem vazar memória.</p>
80
81<p>Embora o método {@link android.app.Activity#onPause onPause()} seja chamado antes de
82{@link android.app.Activity#onStop()}, use {@link android.app.Activity#onStop onStop()}
83para executar operações de desligamento maiores, que exigem mais da CPU, como escrever informação no
84banco de dados.</p>
85
86<p>Por exemplo, esta é uma implementação de {@link android.app.Activity#onStop onStop()} que
87salva os conteúdos de uma nota de rascunho no armazenamento persistente:</p>
88
89<!-- TODO: Find a better example for onStop, because this kind of thing should probably use a
90separate thread but that's too complicated to show here. -->
91<pre>
92&#64;Override
93protected void onStop() {
94    super.onStop();  // Always call the superclass method first
95
96    // Save the note's current draft, because the activity is stopping
97    // and we want to be sure the current note progress isn't lost.
98    ContentValues values = new ContentValues();
99    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
100    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
101
102    getContentResolver().update(
103            mUri,    // The URI for the note to update.
104            values,  // The map of column names and new values to apply to them.
105            null,    // No SELECT criteria are used.
106            null     // No WHERE columns are used.
107            );
108}
109</pre>
110
111<p>Quando sua atividade é interrompida, o objeto {@link android.app.Activity} é mantido na memória
112e é chamado novamente quando a atividade é reiniciada. Não é necessário reiniciar componentes que foram
113criados durante qualquer método de retorno de chamada que leve ao estado Reiniciado. O sistema também
114tem controle do estado atual de cada {@link android.view.View} no layout. Portanto, se o usuário
115inserir um texto em um widget do {@link android.widget.EditText}, o conteúdo será retido e você não
116precisará salvar e restaurar.</p>
117
118<p class="note"><strong>Observação:</strong> mesmo que o sistema destrua sua atividade enquanto estiver interrompida,
119ele ainda mantém o estado do objeto {@link android.view.View} (como texto em {@link
120android.widget.EditText}) em um {@link android.os.Bundle} (um blob de pares de valores-chave) e os restaura
121se o usuário navegar de volta para a mesma instância da atividade (a <a href="recreating.html">próxima lição</a> falará mais sobre uso do {@link android.os.Bundle} para salvar
122outros dados do estado caso sua atividade seja destruída e recriada).</p>
123
124
125
126<h2 id="Start">Iniciar/reiniciar sua atividade</h2>
127
128<p>Quando sua atividade voltar ao primeiro plano do estado interrompido, ela recebe uma chamada para
129{@link android.app.Activity#onRestart()}. O sistema também chama o método {@link
130android.app.Activity#onStart()}, que acontece sempre que a atividade se tornar visível
131(ao ser reiniciada ou criada pela primeira vez). No entanto, o método {@link
132android.app.Activity#onRestart()} é chamado apenas quando a atividade é reiniciada do
133estado interrompido. Portanto, é possível usá-la para executar trabalhos de restauração especiais necessários apenas se
134a atividade tiver sido interrompida, mas não destruída.</p>
135
136<p>Dificilmente um aplicativo precisará usar {@link android.app.Activity#onRestart()} para restaurar
137o estado da atividade. Portanto, não há diretrizes para este método que se apliquem à
138população geral de aplicativos. Contudo, como espera-se que o método {@link android.app.Activity#onStop()}
139limpe todos os recursos da atividade, será necessário instanciá-los
140quando a atividade for reiniciada. Ainda assim, será necessário instanciá-los quando a atividade for criada
141pela primeira vez (quando não houver instâncias existentes da atividade). Por esse motivo, recomenda-se
142utilizar o método de retorno de chamada {@link android.app.Activity#onStart()} como contrapartida
143ao método {@link android.app.Activity#onStop()}, porque o sistema chama {@link
144android.app.Activity#onStart()} quando cria sua atividade e quando reinicia a
145atividade do estado interrompido.</p>
146
147<p>Por exemplo, como o usuário pode ter ficado longe do aplicativo por um longo período
148, o método {@link android.app.Activity#onStart()} é uma boa forma de confirmar se
149os recursos do sistema exigidos estão habilitados:</p>
150
151<pre>
152&#64;Override
153protected void onStart() {
154    super.onStart();  // Always call the superclass method first
155
156    // The activity is either being restarted or started for the first time
157    // so this is where we should make sure that GPS is enabled
158    LocationManager locationManager =
159            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
160    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
161
162    if (!gpsEnabled) {
163        // Create a dialog here that requests the user to enable GPS, and use an intent
164        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
165        // to take the user to the Settings screen to enable GPS when they click "OK"
166    }
167}
168
169&#64;Override
170protected void onRestart() {
171    super.onRestart();  // Always call the superclass method first
172
173    // Activity being restarted from stopped state
174}
175</pre>
176
177
178
179
180<p>Quando o sistema destrói a atividade, ele chama o método {@link android.app.Activity#onDestroy()}
181para seu {@link android.app.Activity}. Como talvez a maior parte de
182seus recursos tenha sido liberada com {@link android.app.Activity#onStop()}, no momento em que você receber a chamada para {@link
183android.app.Activity#onDestroy()}, não haverá muito a ser feito pelos aplicativos. Esse método é sua
184última chance de limpar os recursos que levariam a vazamento de memória. Portanto, certifique-se de que
185outros threads sejam destruídos e outras ações de longa execução como o rastreamento de métodos também estejam
186interrompidas.</p>
187
188