super.onCreate (savedInstanceState);

88

Eu criei um projeto de aplicativo Android e em MainActivity.java> onCreate()ele está chamando super.onCreate(savedInstanceState).

Como um iniciante, alguém pode explicar qual é o propósito da linha acima?

Pramod
fonte

Respostas:

159

Cada Activity que você faz é iniciada por meio de uma sequência de chamadas de método. onCreate()é a primeira dessas chamadas.

Cada uma de suas atividades se estende android.app.Activitydiretamente ou criando uma subclasse de outra subclasse de Activity.

Em Java, quando você herda de uma classe, você pode substituir seus métodos para executar seu próprio código neles. Um exemplo muito comum disso é a substituição do toString()método ao estender java.lang.Object.

Quando substituímos um método, temos a opção de substituir completamente o método em nossa classe ou de estender o método da classe pai existente. Ao chamar super.onCreate(savedInstanceState);, você diz ao Dalvik VM para executar seu código , além do código existente no onCreate () da classe pai. Se você deixar esta linha de fora, apenas o seu código será executado. O código existente é completamente ignorado.

No entanto, você deve incluir esta super chamada em seu método, porque se você não fizer isso, o onCreate()código Activitynunca será executado e seu aplicativo terá todos os tipos de problemas, como se não houvesse Contexto atribuído à atividade (embora você acesse a SuperNotCalledExceptionantes de ter a chance de descobrir que você não tem contexto).

Resumindo, as próprias classes do Android podem ser incrivelmente complexas. O código nas classes do framework lida com coisas como desenho de IU, limpeza da casa e manutenção da atividade e ciclos de vida do aplicativo. superAs chamadas permitem que os desenvolvedores executem esse código complexo nos bastidores, ao mesmo tempo em que fornecem um bom nível de abstração para nossos próprios aplicativos.

Raghav Sood
fonte
2
mais uma pergunta - quando substituímos o método da classe pai, esse método derivado ainda contém o código do método da classe pai ou é um novo método?
Pramod
15
Se você chamar super, o código do método pai será colocado onde está a superchamada. Se super não for chamado, é um método novo.
Raghav Sood
2
Raghav Sood, acho que você deve adicionar seu texto de comentário à resposta, pois ele explica o uso do método super de forma mais compreensível para iniciantes. Pelo menos eu entendi apenas pelo seu comentário :)
Ayaz Alifov
5

* O onCreate(bundle)método da classe derivada deve chamar a implementação da superclasse deste método. Ele lançará uma exceção SuperNotCalledException se a palavra-chave " super " não for usada.

Para herança em Java, para substituir o método da superclasse e também para executar o método de classe acima, use super.methodname()no método de classe derivada de substituição;

A classe Android funciona da mesma maneira. Ao estender a Activityclasse que possui o onCreate(Bundle bundle)método no qual o código significativo é escrito e para executar esse código na atividade definida, use a palavra-chave super com o método onCreate () like super.onCreate(bundle).

Este é um código escrito no onCreate()método da classe Activity e a equipe de desenvolvimento do Android pode adicionar algum código mais significativo a esse método posteriormente. Portanto, para refletir as adições, você deve chamar super.onCreate () em sua Activityclasse.

protected void  onCreate(Bundle savedInstanceState) {
    mVisibleFromClient = mWindow.getWindowStyle().getBoolean(
    com.android.internal.R.styleable.Window_windowNoDisplay, true);
    mCalled = true;
}

boolean mVisibleFromClient = true;

/**
 * Controls whether this activity main window is visible.  This is intended
 * only for the special case of an activity that is not going to show a
 * UI itself, but can't just finish prior to onResume() because it needs
 * to wait for a service binding or such.  Setting this to false prevents the UI from being shown during that time.
 * 
 * <p>The default value for this is taken from the
 * {@link android.R.attr#windowNoDisplay} attribute of the activity's theme.
 */

Ele também mantém a variável, o mCalledque significa que você chamou o super.onCreate(savedBundleInstance)em sua atividade.

final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

Veja o código fonte aqui.

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/1.5_r4/android/app/Activity.java#Activity.onCreate%28android.os.Bundle%29

Ajay S
fonte
1

Porque em super.onCreate () ele alcançará a classe Activity (classe pai de qualquer atividade) para carregar o savedInstanceState, e normalmente não definimos nenhum estado de instância salvo, mas o framework android fez de tal forma que deveríamos chamar aquele.

Govil
fonte
Seu código será compilado sem problemas, mesmo se você não chamar super.onCreate(savedInstanceState), a menos que haja algum outro erro nele
Raghav Sood
1

É a informação que você deseja que retorne ao seu aplicativo, via onCreate (), se a atividade for destruída e reiniciada por algum motivo implícito (por exemplo, não porque o usuário pressionou o botão Voltar). O uso mais comum de onSaveInstanceState () é para lidar com rotações de tela, pois por padrão, as atividades são destruídas e recriadas quando o usuário desliza o teclado G1.

O motivo para chamar super.onCreate (savedInstanceState) é porque seu código não será compilado de outra forma. ;-)

M_ Fa
fonte