Existem uns poucos cenários no qual sua ação é destruída devido ao
comportamento normal do aplicativo, tais como quando o usuário pressiona o
botão retorno ou sua ação sinaliza sua própria destruição ao chamar finish(). O sistema pode também destruir sua
ação se estiver atualmente parada e não tenha sido usada a algum tempo ou a
ação de primeiro plano requer mais recursos do sistema, que acaba fechando
todos os processos em segundo plano para recuperar a memória.
Quando sua ação é destruída devido ao usuário pressionar o Retorno ou a
ação finalizar a si mesma, o conceito do sistema de que a instancia da Ação se encerra em
definitivo devido ao comportamento indicar que a ação não é mais necessária. De
qualquer forma, se o sistema destruir sua ação devido às restrições do sistema
(ao invés do comportamento normal do aplicativo), então mesmo que a instancia
atual de Ação tenha saído, o sistema se
lembra de que existiu como no caso em que o usuário navega de volta ao mesmo, o
sistema cria uma nova instancia da ação usando um conjunto de dados salvos que descreve
o estado da atividade quando esta foi destruída. Os dados salvos que o sistema
usa para restaurar o estado anterior são chamados “estados da instancia” e é uma
coleção de valores chaves armazenada no objeto Bundle.
Atenção: Sua ação será destruída e recriada cada vez que o usuário girar a
tela. Quando a tela muda orietanção, o sistema destrói recria a ação de segundo
plano uma vez que a configuração de tela foi alterada e sua ação pode precisar
recarregar recursos alternativos (tais como o esboço).
Por padrão, o sistema usa o estado de instancia Bundle para salvar
informação de cada objeto View no esboço da
sua ação (tais como o valor texto adicionada em um objeto EditText). Portanto, sua instancia de ação é destruída e
recriada, o estado do esboço é restaurado para o estado anterior sem a
necessidade de escrever código por você. De qualquer forma, sua ação pode ter
mais informações que você gostaria de restaurar, tais como variáveis membros
que mantém o progresso da ação.
Nota: Em ordem para que sistema do Android restaure o estado do campo
visual de sua ação, cada campo visual
tem de ter um ID único, fornecido pelo atributo android:id .
Para salvar dados adicionais sobre o estado da ação, você deve
sobrescrever o método de chamada onSaveInstanceState(). O sistema chama
este método quando o usuário está abandonando sua ação e passando para o objeto Bundle que será
salvo no evento em que sua ação é destruída inesperadamente. Se o sistema tiver
de recriar a instancia da ação depois, irá passar o mesmo objeto Bundle para ambos os
métodos onRestoreInstanceState() e onCreate().
![]() |
| Figura. Conforme o sistema começa a parar sua ação, irá chamar onSaveInstanceState() (1) para que você possa especificar dados adicionais ao estado que você gostaria de salvar no caso da instancia da Ação precisar ser recriada. Se a ação for destruída e a mesma instancia deva ser recriada, o sistema passa os dados do estado definidos em (1) para ambos os métodos onCreate() (2) e onRestoreInstanceState() (3). |
Salvando o Estado da Sua Ação
Conforme sua ação começa a parar, o sistema chama onSaveInstanceState() para que sua ação possa salvar a informação do estado com uma
coleção de valores chaves. A implementação padrão deste método salva a
informação sobre o estado de hierarquia do campo visual da ação, tais como o
texto dentro da caixa de interface EditText ou deslizando
para a posição de um ListView.
Para salvar informações de estado adicionais para sua ação, você deve programar onSaveInstanceState() e adicionar valores chaves para o objeto Bundle. Por exemplo:
static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
static final String STATE_LEVEL = "playerLevel";
...
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Atenção: Sempre chame a implementação da superclasse de onSaveInstanceState() para que o padrão
da implementação possa salvar o estado de hierarquia do campo visual.
Restaurando o Estado de Sua Ação
Quando sua ação é recriada após ter sido previamente destruída, você
pode recuperar o estado salvo através do conjunto Bundle que o sistema
passou para sua ação. Ambos os métodos de chamada onCreate() e onRestoreInstanceState() recebem o mesmo Bundle que contem o
estado de informações da instancia.
Pela razão do método onCreate() ter sido chamado
tanto pelo sistema estar criando uma nova instancia de sua ação ou por recriar
a anterior, você deve verificar se o estado de Bundle ser nulo antes
de tentar ler o mesmo. Se não for nulo, então o sistema está criando uma nova
instancia da ação, ao invés de restaurar ao anterior que foi destruído.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // Always call the superclass first
// Check whether we're recreating a previously destroyed instance
if (savedInstanceState != null) {
// Restore value of members from saved state
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
} else {
// Probably initialize members with default values for a new instance
}
...
}
Ao invés de restaurar o estado durante onCreate() você pode
escolher programar onRestoreInstanceState(), ao qual o sistema
chama após o método onStart(). O sistema chama onRestoreInstanceState() somente se existe algum estado salvo para ser restaurado, para que
você não precise checar quando Bundle é nulo:
public void onRestoreInstanceState(Bundle
savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
Atenção: Sempre chame a implementação da superclasse de onRestoreInstanceState() para que a implementação padrão restaure o estado de hierarquia do
campo visual.
Para aprender mais sobre recriando sua ação devido ao evento de reinicio durante o tempo de execução (tais como as rotações de tela), veremos futuramente como controlar mudanças no tempo de execução.

Nenhum comentário:
Postar um comentário