Criar (Pacote salvoInstanceState)

122

Alguém pode me ajudar a conhecer o Bundle savedInstanceStateem onCreate(Bundle savedInstanceState)Eu sou novato no Android. Eu tento entender isso em developer.android.com. Mas eu não sou capaz de entender. Alguém pode simplificá-lo?

user1077015
fonte
2
Este é um bom vídeo: youtube.com/watch?v=kkYIMZw9gzQ
Francisco Corrales Morales

Respostas:

106

Se você salvar o estado do aplicativo em um pacote configurável (normalmente dados dinâmicos e não persistentes onSaveInstanceState), ele poderá ser repassado para onCreatese a atividade precisar ser recriada (por exemplo, alteração de orientação) para que você não perca isso antes. em formação. Se nenhum dado foi fornecido, savedInstanceStateé nulo.

... você deve usar o método onPause () para gravar quaisquer dados persistentes (como edições do usuário) no armazenamento. Além disso, o método onSaveInstanceState (Bundle) é chamado antes de colocar a atividade em um estado em segundo plano, permitindo salvar qualquer estado dinâmico da instância em sua atividade no determinado Bundle, para ser recebido posteriormente em onCreate (Bundle) se a atividade precisa ser recriado. Consulte a seção Ciclo de vida do processo para obter mais informações sobre como o ciclo de vida de um processo está vinculado às atividades que ele está hospedando. Observe que é importante salvar dados persistentes em onPause () em vez de onSaveInstanceState (Bundle) porque o último não faz parte dos retornos de chamada do ciclo de vida, portanto, não será chamado em todas as situações, conforme descrito em sua documentação.

fonte

Dhruv Gairola
fonte
2
outras atividades compartilham o mesmo pacote ?, se eu iniciar outra atividade, ele passa o pacote desde a primeira?
Francisco Corrales Morales
17

onCreate(Bundle savedInstanceState)você receberá o Bundlenulo quando a atividade começar pela primeira vez e será usada quando a orientação da atividade for alterada .......

http://www.gitshah.com/2011/03/how-to-handle-screen-orientation_28.html

O Android oferece outra maneira elegante de conseguir isso. Para conseguir isso, precisamos substituir um método chamado onSaveInstanceState(). A plataforma Android permite que os usuários salvem qualquer estado da instância. O estado da instância pode ser salvo no Bundle. O pacote é passado como argumento para o método onSaveInstanceState.

podemos carregar o estado da instância salva do pacote passado como argumento para o onCreatemétodo Também podemos carregar o estado da instância salva no onRestoreInstanceStatemétodo Mas deixarei isso para os leitores descobrirem.

Dheeresh Singh
fonte
11
savedInstanceStateserá não- nullse onSavedInstanceState()foi chamado anteriormente. mudanças de orientação são apenas um exemplo em que isso pode ocorrer.
Alex Lockwood
1
@AlexLockwood, estou tentando pensar em todas as situações em que isso pode ocorrer. Existe alguma documentação? Uma instância em que consigo pensar é se o usuário alterna entre aplicativos e volta, mas a atividade foi destruída para recuperar recursos. Nesse caso, o Android recriará a atividade com um pacote se onSaveInsanceState () foi substituído, certo?
batbrat
1
@batbrat Sim ... o comentário que fiz (quase dois anos atrás) não está totalmente correto. Eu acho que a melhor maneira de colocá-lo é o Bundleargumento onCreate(Bundle)será non- nullif e somente se o método Activitytiver onSaveInstanceStatesido chamado anteriormente. Isso acontece durante as alterações de orientação ... e também ocorre quando a atividade volta após ser interrompida pelo sistema operacional e quando você aciona qualquer outra alteração de interesse no seu dispositivo.
Alex Lockwood
Obrigado pelo esclarecimento Alex. É bom ter alguma clareza sobre o assunto. Eu tinha esquecido outras alterações de configuração, exceto as opções de orientação.
batbrat 30/03
15

Como Dhruv Gairola respondeu, você pode salvar o estado do aplicativo usando o Bundle savedInstanceState. Estou tentando dar um exemplo muito simples que novos alunos como eu podem entender facilmente.

Suponha que você tenha um fragmento simples com um TextView e um botão. Cada vez que você clica no botão, o texto muda. Agora, altere a orientação do seu dispositivo / emulador e observe que você perdeu os dados (significa os dados alterados após clicar em você conseguiu) e o fragmento é iniciado pela primeira vez novamente. Usando o Bundle savedInstanceState, podemos nos livrar disso. Se você der uma olhada no ciclo de vida do fragmento. No fragmento Lifecylce, você verá que um método "onSaveInstanceState" é chamado quando o fragmento está prestes a ser destruído.

Portanto, podemos salvar o estado, o valor do texto alterado nesse pacote, como este

 int counter  = 0;
 @Override
 public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putInt("value",counter);
 }

Depois de fazer a orientação, o método "onCreate" será chamado, certo? para que possamos fazer isso

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if(savedInstanceState == null){
        //it is the first time the fragment is being called
        counter = 0;
    }else{
        //not the first time so we will check SavedInstanceState bundle
        counter = savedInstanceState.getInt("value",0); //here zero is the default value
    }
}

Agora, você não perderá seu valor após a orientação. O valor modificado sempre será exibido.

Asad
fonte
Observe que isso também se aplica à atividade. Você pode explicar mais sobre a diferença de (Pacote de atividades) e Pacote de fragmentos?
Laalaguer
Você pode obter uma compreensão clara dos ciclos de vida da atividade e do fragmento, onde uma atividade pode exibir vários fragmentos de cada vez. Portanto, a diferença básica é que você pode salvar alguns valores para todos os fragmentos de uma atividade e, em seguida, você use o pacote de atividades, caso contrário, você deve usar o pacote de fragmentos se for para um fragmento específico.
Asad
5

Função onCreate (Bundle savedInstanceState) no Android:

1) Quando uma Atividade é chamada ou iniciada pela primeira vez, o método onCreate (Bundle savedInstanceState) é responsável por criar a atividade.

2) Sempre que a orientação (ou seja, da horizontal para a vertical ou vertical para horizontal) da atividade for alterada ou quando uma Atividade for encerrada com força por qualquer Sistema Operacional, o saveInstanceState, ou seja, o objeto da Classe de Pacote salvará o estado de uma Atividade.

3) Depois que a Orientação mudou, o onCreate (Bundle savedInstanceState) chamará e recriará a atividade e carregará todos os dados de savedInstanceState.

4) Basicamente, a classe Bundle é usada para armazenar os dados da atividade sempre que a condição acima ocorrer no aplicativo.

5) onCreate () não é necessário para aplicativos. Mas o motivo pelo qual é usado no aplicativo é porque esse método é o melhor lugar para colocar o código de inicialização.

6) Você também pode colocar seu código de inicialização em onStart () ou onResume () e, quando o aplicativo for carregado primeiro, funcionará da mesma forma que em onCreate ().

Abhi
fonte
4

onCreate(Bundle)é chamado quando a atividade é iniciada pela primeira vez. Você pode usá-lo para executar uma inicialização única, como a criação da interface do usuário. onCreate()usa um parâmetro que é nulo ou algumas informações de estado salvas anteriormente pelo onSaveInstanceState.

psxls
fonte
0

onCreate (Bundle savedInstanceState) é chamado e savedInstanceState não será nulo se sua Atividade e foi encerrada em um cenário (visualização visual) descrito acima. Seu aplicativo pode então pegar (capturar) os dados de SavedInstanceState e regenerar sua atividade

kabilan
fonte