web-dev-qa-db-fra.com

super.onCreate (savedInstanceState);

J'ai créé un Android Projet d'application 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?

80
Pramod

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

Chacune de vos activités s'étend sur Android.app.Activity Directement ou en sous-classant une autre sous-classe de Activity.

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

Lorsque nous substituons une méthode, nous avons la possibilité de remplacer complètement la méthode de notre classe ou d'étendre la méthode de la classe parente existante. En appelant super.onCreate(savedInstanceState);, vous indiquez à Dalvik VM d'exécuter votre code en outre au code existant dans onCreate () de la classe parente Si vous oubliez cette ligne, alors 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, alors le code onCreate() dans Activity ne sera jamais exécuté et votre application rencontrera toutes sortes de problèmes tels que ne pas assigner de contexte à l'activité (bien que vous frappiez un SuperNotCalledException avant d'avoir une chance de comprendre que vous n'avez pas de contexte).

En bref, les classes d'Android peuvent être incroyablement complexes. Le code dans les classes d'infrastructure gère des tâches telles que le dessin d'interface utilisateur, le nettoyage de la maison et la maintenance du cycle de vie de l'activité et de l'application. Les appels super permettent aux développeurs d'exécuter ce code complexe en coulisse, tout en fournissant un bon niveau d'abstraction pour nos propres applications.

146
Raghav Sood

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

Pour hériter dans Java, pour remplacer la méthode superclass et pour exécuter la méthode de classe ci-dessus, utilisez super.methodname() dans la méthode de classe dérivée dérivée;

La classe Android fonctionne de la même manière. En étendant la classe Activity qui a la méthode onCreate(Bundle bundle) 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 () comme la fonction super.onCreate(bundle).

Il s'agit d'un code écrit dans la méthode Activity class onCreate() et Android. L’équipe de développement peut ajouter ultérieurement un code plus significatif à cette méthode. Ainsi, afin de refléter les ajouts, sont censés appeler super super.onCreate () dans votre classe Activity.

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 conserve également la variable mCalled, ce 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 .Groupe% 29

4
Ajay S

Parce que lors de super.onCreate (), il atteindra la classe Activity (classe parente de toute activité) pour charger le savedInstanceState, et nous ne définirons normalement aucun état d’instance sauvegardé, mais Android créé de telle sorte que nous devrions appeler cela.

1
Govil

Il s’agit 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 Précédent). L’utilisation la plus courante de onSaveInstanceState () consiste à gérer les rotations d’écran car, par défaut, les activités sont détruites et recréées lorsque l’utilisateur glisse le clavier G1.

La raison pour appeler super.onCreate (savedInstanceState) est que votre code ne sera pas compilé autrement. ;-)

1
M_ Fa