super.onCreate(savedInstanceState);

98
我已经创建了一个Android应用程序项目,在MainActivity.java文件中的onCreate()方法中调用了super.onCreate(savedInstanceState)。
作为初学者,有人可以解释一下上述代码行的目的吗?
4个回答

177

您每进行一项活动,都会通过一系列方法调用来启动。其中onCreate()是这些调用中的第一个。

您的每个Activity都直接或通过其他Activity的子类扩展android.app.Activity

在Java中,当您从一个类继承时,可以重写其方法以运行自己的代码。这种情况非常普遍,例如在扩展java.lang.Object时覆盖toString()方法。

当我们重写一个方法时,我们可以选择完全替换类中的方法,也可以扩展现有父类的方法。通过调用super.onCreate(savedInstanceState);,您告诉Dalvik VM在父类的onCreate()中运行您的代码以及现有代码。如果省略此行,则只运行您的代码。现有代码将被完全忽略。

但是,您必须在自己的方法中包含此超级调用,因为如果不这样做,则Activity中的onCreate()代码永远不会运行,您的应用程序将遇到各种问题,例如未分配给活动的上下文(虽然在发现没有上下文之前,您将遇到SuperNotCalledException)。

简而言之,Android的本身的类可以非常复杂。框架类中的代码处理UI绘制、清理和维护Activity和应用生命周期等问题。super调用允许开发人员在幕后运行此复杂代码,同时为我们自己的应用程序提供良好的抽象程度。


2
还有一个问题 - 当我们覆盖父类方法时,这个派生方法是否仍然包含父类方法的代码,还是它是一个全新的方法? - Pramod
16
如果你调用super,父类方法的代码将会被放置在super调用处。如果不调用super,它就是一个新的方法。 - Raghav Sood
2
Raghav Sood,我认为你应该将你的评论文本添加到答案中,因为它更易于理解超级方法的用法,特别是对于初学者来说。至少我只从你的评论中理解了它 :) - Ayaz Alifov
那非常详细,真的很有帮助。在2021年,我发现它仍然很有用。 - Naimul Kabir

5
*派生类onCreate(bundle)方法必须调用超类实现此方法。如果没有使用"super"关键字,它将抛出异常SuperNotCalledException

在Java中进行继承,要重写超类方法并执行上述类方法,在覆盖的派生类方法中使用super.methodname()

Android类也是这样工作的。通过扩展具有onCreate(Bundle bundle)方法的Activity类,在其中编写有意义的代码,并使用带有super.onCreate(bundle)的onCreate()方法来执行定义的活动中的代码。

这是Activity类onCreate()方法中的一段代码,Android Dev团队可能会稍后添加更多有意义的代码到这个方法中。因此,为了反映这些新增内容,你应该在你的Activity类中调用super.onCreate()

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.
 */

它还维护变量 mCalled,这意味着您在 Activity 中调用了 super.onCreate(savedBundleInstance)
final void performStart() {
    mCalled = false;
    mInstrumentation.callActivityOnStart(this);
    if (!mCalled) {
        throw new SuperNotCalledException(
            "Activity " + mComponent.toShortString() +
            " did not call through to super.onStart()");
    }
}

在这里查看源代码。

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


1

如果由于某些隐含原因(例如不是用户按下返回按钮)而导致活动被销毁并重新启动,您希望通过onCreate()将信息返回到应用程序。 onSaveInstanceState()的最常见用途是处理屏幕旋转,因为默认情况下,当用户滑出G1键盘时,活动会被销毁并重新创建。

调用super.onCreate(savedInstanceState)的原因是否则您的代码将无法编译。 ;-)


1
因为在super.onCreate()时,它会到达Activity(任何活动的父类)类来加载savedInstanceState,而我们通常不设置任何保存的实例状态,但是Android框架设计成这样,我们应该调用它。

除非您的代码中存在其他错误,否则即使您不调用super.onCreate(savedInstanceState),它也会编译成功。 - Raghav Sood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接