super.onCreate (savedInstanceState);

88

J'ai créé un projet d'application Android et dans MainActivity.java> onCreate()il appelle super.onCreate(savedInstanceState).

En tant que débutant, quelqu'un peut-il expliquer quel est le but de la ligne ci-dessus?

Pramod
la source

Réponses:

159

Chaque activité que vous effectuez est démarrée par une séquence d'appels de méthode. onCreate()est le premier de ces appels.

Chacune de vos activités s'étend android.app.Activitysoit directement, soit en sous-classant une autre sous-classe de Activity.

En Java, lorsque vous héritez d'une classe, vous pouvez remplacer ses méthodes pour y exécuter votre propre code. Un exemple très courant de ceci est le remplacement de la toString()méthode lors de l'extension java.lang.Object.

Lorsque nous surchargons une méthode, nous avons la possibilité de remplacer complètement la méthode dans notre classe, ou d'étendre la méthode de la classe parent existante. En appelant super.onCreate(savedInstanceState);, vous dites à la VM Dalvik d'exécuter votre code en plus du code existant dans le onCreate () de la classe parent. Si vous omettez cette ligne, seul votre code est exécuté. Le code existant est complètement ignoré.

Cependant, vous devez inclure ce super appel dans votre méthode, car si vous ne le faites pas, le onCreate()code Activityn'est jamais exécuté et votre application rencontrera toutes sortes de problèmes, comme le fait de ne pas avoir de contexte attribué à l'activité (bien que vous frappiez a SuperNotCalledExceptionavant d'avoir une chance de comprendre que vous n'avez pas de contexte).

En bref, les propres classes d'Android peuvent être incroyablement complexes. Le code dans les classes de structure gère des éléments tels que le dessin de l'interface utilisateur, le nettoyage de la maison et la maintenance des cycles de vie d'activité et d'application. superLes appels permettent aux développeurs d'exécuter ce code complexe dans les coulisses, tout en fournissant un bon niveau d'abstraction pour nos propres applications.

Raghav Sood
la source
2
une autre question - lorsque nous remplaçons la méthode de classe parente, cette méthode dérivée contient-elle toujours le code de la méthode de classe parente ou est-ce une nouvelle méthode?
Pramod
15
Si vous appelez super, le code de la méthode parente est placé là où se trouve le super appel. Si super n'est pas appelé, c'est une nouvelle méthode.
Raghav Sood
2
Raghav Sood, je pense que vous devriez ajouter votre texte de commentaire à la réponse car il explique l'utilisation de la super méthode de manière plus compréhensible pour les débutants. Au moins je ne l'ai compris qu'à partir de votre commentaire :)
Ayaz Alifov
5

* La onCreate(bundle)méthode de classe dérivée doit appeler l'implémentation de superclasse de cette méthode. Il lèvera une exception SuperNotCalledException si le mot clé " super " n'est pas utilisé.

Pour l'héritage dans Java, pour remplacer la méthode de la superclasse et également pour exécuter la méthode de classe ci-dessus, utilisez super.methodname()dans la méthode de classe dérivée de substitution ;

La classe Android fonctionne de la même manière. En étendant la Activityclasse qui a la onCreate(Bundle bundle)méthode dans laquelle du code significatif est écrit et pour exécuter ce code dans l'activité définie, utilisez le mot clé super avec la méthode onCreate () like super.onCreate(bundle).

Il s'agit d'un code écrit dans la onCreate()méthode de classe Activity et l'équipe de développement Android pourrait ajouter du code plus significatif à cette méthode plus tard. Ainsi, afin de refléter les ajouts, vous êtes censé appeler le super.onCreate () dans votre 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.
 */

Il gère également la variable, mCalledce qui signifie que vous avez appelé le super.onCreate(savedBundleInstance)dans votre activité.

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

Voir le code source ici.

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
la source
1

Parce que sur super.onCreate (), il atteindra la classe Activity (classe parente de toute activité) pour charger le savedInstanceState, et nous ne définissons normalement aucun état d'instance enregistré, mais le framework Android fait de telle manière que nous devrions appeler cette.

Govil
la source
Votre code se compilera volontiers même si vous n'appelez pas super.onCreate(savedInstanceState), sauf si vous avez une autre erreur
Raghav Sood
1

Ce sont des informations que vous souhaitez renvoyer à votre application, via onCreate (), si l'activité est détruite et redémarrée pour une raison implicite (par exemple, pas parce que l'utilisateur a appuyé sur le bouton retour). L'utilisation la plus courante de onSaveInstanceState () est de gérer les rotations d'écran, car par défaut, les activités sont détruites et recréées lorsque l'utilisateur fait glisser le clavier G1.

La raison d'appeler super.onCreate (savedInstanceState) est que votre code ne se compilera pas autrement. ;-)

M_ Fa
la source