summaryrefslogtreecommitdiffstats
path: root/docs/html-intl/intl/pt-br/training/basics/activity-lifecycle/stopping.jd
blob: 2eba377294853b798d3b581526c5c1220fdc2ad1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
page.title=Interrompendo e reiniciando uma atividade
page.tags=ciclo de vida da atividade
helpoutsWidget=true

trainingnavtop=true

@jd:body

<div id="tb-wrapper">
  <div id="tb">
    
    <h2>Esta lição ensina a</h2>
    <ol>
      <li><a href="#Stop">Interromper sua atividade</a></li>
      <li><a href="#Start">Iniciar/reiniciar sua atividade</a></li>
    </ol>
    
    <h2>Leia também</h2>
    <ul>
      <li><a href="{@docRoot}guide/components/activities.html">Atividades</a>
      </li>
    </ul>

<h2>Tente</h2>

<div class="download-box">
 <a href="http://developer.android.com/shareables/training/ActivityLifecycle.zip" class="button">Baixar a demonstração</a>
 <p class="filename">ActivityLifecycle.zip</p>
</div>

  </div>
</div>

<p>Interromper e reiniciar adequadamente sua atividade é um processo importante no ciclo de vida da atividade
que garante que o usuário perceba que o aplicativo está sempre ativo e não perca o progresso.
Há alguns cenários fundamentais em que sua atividade é interrompida e reiniciada:</p>

<ul>
  <li>O usuário abre a janela Aplicativos Utilizados Recentemente e alterna de um aplicativo a outro. A
atividade em seu aplicativo atualmente em primeiro plano é interrompida. Se o usuário retornar ao
aplicativo pelo ícone de inicialização da tela inicial ou da janela Aplicativos Utilizados Recentemente, a atividade é reiniciada.</li>
  <li>O usuário executar uma ação em seu aplicativo que inicia uma nova atividade. A atividade atual
é interrompida quando a segunda é criada. Se o usuário pressionar o botão <em>Voltar</em>
, a primeira atividade será reiniciada.</li>
  <li>Se o usuário receber uma chamada telefônica enquanto estiver usando o seu aplicativo.</li>
</ul>

<p>A classe {@link android.app.Activity} fornece dois métodos do ciclo de vida, {@link
android.app.Activity#onStop()} e {@link android.app.Activity#onRestart()}, que permite que você
decida exatamente como a atividade responderá à interrupção e reinicialização. Diferentemente do estado pausado,
que identifica obstruções parciais da interface de usuário, o estado interrompido garante que a interface não fique
visível e que o foco do usuário permaneça em outra atividade (ou mesmo outro aplicativo).</p>

<p class="note"><strong>Observação:</strong> como o sistema retém a instância {@link android.app.Activity}
na memória quando interrompida, talvez não seja necessário implementar os métodos
{@link android.app.Activity#onStop()} e {@link android.app.Activity#onRestart()} (ou mesmo {@link
android.app.Activity#onStart()}. Para a maioria das atividades que são relativamente simples, a
atividade será interrompida e reiniciada normalmente e talvez seja necessário apenas usar {@link
android.app.Activity#onPause()} para pausar ações em andamento e desconectar dos recursos do sistema.</p>

<img src="{@docRoot}images/training/basics/basic-lifecycle-stopped.png" />
<p class="img-caption"><strong>Figura 1.</strong> Quando o usuário sai da atividade, o sistema
chama {@link android.app.Activity#onStop onStop()} para interrompê-la (1). Se o usuário retornar
enquanto a atividade estiver interrompida, o sistema chama {@link android.app.Activity#onRestart onRestart()}
(2), rapidamente seguido por {@link android.app.Activity#onStart onStart()} (3) e {@link
android.app.Activity#onResume()} (4). Observe que independentemente do que tenha causado a interrupção
da atividade, o sistema sempre chama {@link android.app.Activity#onPause onPause()} antes de chamar {@link
android.app.Activity#onStop onStop()}.</p>



<h2 id="Stop">Interromper sua atividade</h2>

<p>Quando sua atividade recebe uma chamada para o método {@link android.app.Activity#onStop()}, não
está mais visível e deve liberar quase todos os recursos que não foram necessários enquanto o usuário não
estiver utilizando. Quando a atividade for interrompida, o sistema pode destruir a instância se for necessário para
recuperar memória do sistema. Em casos extremos, o sistema pode simplesmente desligar o processo do aplicativo sem
chamar o retorno de chamada{@link android.app.Activity#onDestroy()} final da atividade, portanto, é importante
usar {@link android.app.Activity#onStop()} para liberar recursos que podem vazar memória.</p>

<p>Embora o método {@link android.app.Activity#onPause onPause()} seja chamado antes de
{@link android.app.Activity#onStop()}, use {@link android.app.Activity#onStop onStop()}
para executar operações de desligamento maiores, que exigem mais da CPU, como escrever informação no
banco de dados.</p>

<p>Por exemplo, esta é uma implementação de {@link android.app.Activity#onStop onStop()} que
salva os conteúdos de uma nota de rascunho no armazenamento persistente:</p>

<!-- TODO: Find a better example for onStop, because this kind of thing should probably use a
separate thread but that's too complicated to show here. -->
<pre>
&#64;Override
protected void onStop() {
    super.onStop();  // Always call the superclass method first

    // Save the note's current draft, because the activity is stopping
    // and we want to be sure the current note progress isn't lost.
    ContentValues values = new ContentValues();
    values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
    values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());

    getContentResolver().update(
            mUri,    // The URI for the note to update.
            values,  // The map of column names and new values to apply to them.
            null,    // No SELECT criteria are used.
            null     // No WHERE columns are used.
            );
}
</pre>

<p>Quando sua atividade é interrompida, o objeto {@link android.app.Activity} é mantido na memória
e é chamado novamente quando a atividade é reiniciada. Não é necessário reiniciar componentes que foram
criados durante qualquer método de retorno de chamada que leve ao estado Reiniciado. O sistema também
tem controle do estado atual de cada {@link android.view.View} no layout. Portanto, se o usuário
inserir um texto em um widget do {@link android.widget.EditText}, o conteúdo será retido e você não
precisará salvar e restaurar.</p>

<p class="note"><strong>Observação:</strong> mesmo que o sistema destrua sua atividade enquanto estiver interrompida,
ele ainda mantém o estado do objeto {@link android.view.View} (como texto em {@link
android.widget.EditText}) em um {@link android.os.Bundle} (um blob de pares de valores-chave) e os restaura
se 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
outros dados do estado caso sua atividade seja destruída e recriada).</p>



<h2 id="Start">Iniciar/reiniciar sua atividade</h2>

<p>Quando sua atividade voltar ao primeiro plano do estado interrompido, ela recebe uma chamada para
{@link android.app.Activity#onRestart()}. O sistema também chama o método {@link
android.app.Activity#onStart()}, que acontece sempre que a atividade se tornar visível
(ao ser reiniciada ou criada pela primeira vez). No entanto, o método {@link
android.app.Activity#onRestart()} é chamado apenas quando a atividade é reiniciada do
estado interrompido. Portanto, é possível usá-la para executar trabalhos de restauração especiais necessários apenas se
a atividade tiver sido interrompida, mas não destruída.</p>

<p>Dificilmente um aplicativo precisará usar {@link android.app.Activity#onRestart()} para restaurar
o estado da atividade. Portanto, não há diretrizes para este método que se apliquem à
população geral de aplicativos. Contudo, como espera-se que o método {@link android.app.Activity#onStop()}
limpe todos os recursos da atividade, será necessário instanciá-los
quando a atividade for reiniciada. Ainda assim, será necessário instanciá-los quando a atividade for criada
pela primeira vez (quando não houver instâncias existentes da atividade). Por esse motivo, recomenda-se
utilizar o método de retorno de chamada {@link android.app.Activity#onStart()} como contrapartida
ao método {@link android.app.Activity#onStop()}, porque o sistema chama {@link
android.app.Activity#onStart()} quando cria sua atividade e quando reinicia a
atividade do estado interrompido.</p>

<p>Por exemplo, como o usuário pode ter ficado longe do aplicativo por um longo período
, o método {@link android.app.Activity#onStart()} é uma boa forma de confirmar se
os recursos do sistema exigidos estão habilitados:</p>

<pre>
&#64;Override
protected void onStart() {
    super.onStart();  // Always call the superclass method first
    
    // The activity is either being restarted or started for the first time
    // so this is where we should make sure that GPS is enabled
    LocationManager locationManager = 
            (LocationManager) getSystemService(Context.LOCATION_SERVICE);
    boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
    
    if (!gpsEnabled) {
        // Create a dialog here that requests the user to enable GPS, and use an intent
        // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action
        // to take the user to the Settings screen to enable GPS when they click "OK"
    }
}

&#64;Override
protected void onRestart() {
    super.onRestart();  // Always call the superclass method first
    
    // Activity being restarted from stopped state    
}
</pre>




<p>Quando o sistema destrói a atividade, ele chama o método {@link android.app.Activity#onDestroy()}
para seu {@link android.app.Activity}. Como talvez a maior parte de
seus recursos tenha sido liberada com {@link android.app.Activity#onStop()}, no momento em que você receber a chamada para {@link
android.app.Activity#onDestroy()}, não haverá muito a ser feito pelos aplicativos. Esse método é sua
última chance de limpar os recursos que levariam a vazamento de memória. Portanto, certifique-se de que
outros threads sejam destruídos e outras ações de longa execução como o rastreamento de métodos também estejam
interrompidas.</p>