Salvando informações do formulário no Android
Estamos em um formulário de uma app Android e já preenchemos praticamente todas as informações, porém assim que viramos a tela do dispositivo acabamos perdendo tudo. Por que isso acontece? Vejamos o ciclo de vida da Activity
:
Ao iniciarmos a aplicação é chamado o método onCreate()
, responsável por construir toda a aplicação. Depois desse método, é chamado outro, o onStart()
, que de fato inicia a aplicação. Depois de iniciada, o Android chama o onResume()
que vai interagindo com o usuário, atualizando a aplicação na medida que é necessário.
Quando viramos a tela é chamado o onPause()
que pausa a aplicação e em seguida o onStop()
que pára tudo. Depois nossa activity é destruída através do método onDestroy()
e em seguida é criada novamente, chamando o onCreate()
.
Então podemos concluir que nosso formulário ao ser virado, perde todas informações pelo fato dele ser destruído. Mas como podemos resolver isso? Será que da pra salvar as informações contidas nele antes de virarmos?
Poderíamos simplesmente colocar no momento que ela é pausada, mas ainda não o seria adequado, pois a qualquer instante a aplicação poderia ser matada e assim nada seria salvo. Temos um método que poderá nos ajudar neste momento que é o onSaveInstanceState()
, pois ele é chamado antes da Activity
ser parada. O que faz dele ser tão poderoso?
O onSaveInstanceState
recebe como parâmetro um [Bundle](http://developer.android.com/intl/pt-br/reference/android/os/Bundle.html)
. E como este Bundle
pode nos ajudar? Podemos passar para dentro dele todas as informações que queremos salvar, e é exatamente isso que estávamos buscando! Mas como fazer isso?
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putSerializable("nome", nome );
outState.putSerializable("telefone", telefone );
Log.i("Salvando", nome);
Log.i("Salvando", telefone);
}
Nesse caso nosso Bundle outState
está usando o putSerializable()
que funciona como um Map
, passamos nossa chave e em seguida o valor. O bacana disto é que para nosso formulário teríamos vários putSerializable
, para cada campo uma chave e valor.
Testando a nossa app, vamos girar a tela para ver o que ocorre. Usaremos o Log
para verificar o que ele está salvando, no LogCat vemos o seguinte:
02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Salvando: Matheus 02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Salvando: 12345678
Estamos com todos nossos campos salvos agora, se rodarmos nossa app nesse instante e girarmos a tela veremos que nada aconteceu, ou seja, ainda estamos perdendo as informações! Por quê? Como apenas salvamos os campos, em momento algum os restauramos. Há um jeito de pegarmos essas informações ?
Existe um outro método que é chamado assim que iniciamos o ciclo, que é o onRestoreInstanceState()
. Certo, como esse método funciona? É recebido como parâmetro um Bundle
e da mesma forma que salvamos algo nele conseguimos retirar. Podemos pensar da seguinte forma: O Bundle
é uma lavanderia, nossos campos são as roupas. Ao deixamos nossas roupas na lavanderia, deixamos algo que possa nos identificar quando formos retirá-las, por exemplo um telefone, cpf ou rg.
@Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState);
nome = savedInstanceState.getSerializable("nome");
telefone = savedInstanceState.getSerializable("telefone");
Log.i("Restaurando", nome); Log.i("Restaurando", telefone);
}
Aqui estamos usando essa ideia da lavanderia: assim como nós deixamos nossas informações na lavanderia no método onSavedInstanceState()
, aqui estamos pegando o savedInstanceState
, que é o nosso Bundle
, e pedimos nossas informações de volta, passando para cada uma delas nossa identificação. Isto acontece quando usamos o método getSerializable()
, que recebe nosso identificador.
Se rodarmos novamente nossa app, preenchermos o formulário e tentarmos rodar a tela, nenhum dado se perde:
02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Restaurando: Matheus 02-03 12:49:30.338 2930-2930/br.com.caelum.app I/Restaurando: 12345678
Excelente! Agora podemos deixar nosso usuario rodar a tela infinitas vezes e não precisamos mais nos preocupar em perder os dados que ele já havia inserido!
Vimos então que quando nossa activity muda a orientação ela é destruída. Quando estamos tratando de formulários, temos dados que nosso usuario não gostaria de perder e vimos que para solucionar esse problema existem dois métodos: onSaveInstanceState
e o onRestoreInstanceStace
, que nos auxiliam a persistir o dados antes de nossa activity ser destruida e resgatarmos quando for reconstruida, respectivamente.
Quer saber mais sobre Android e mobile? Aqui na Alura, dê uma olhada nos nossos cursos mobile, que tem cursos que abordam esses e muitos outros assuntos para que você construa sua primeira app completa! Também, na Caelum, temos 2 cursos presenciais do básico ao avançando!