super.onCreate(savedInstanceState);


88

我创建了一个Android应用程序项目,并在MainActivity.javaonCreate()中调用它super.onCreate(savedInstanceState)

作为初学者,任何人都可以解释以上内容的目的是什么?

Answers:


159

您进行的每个活动都是通过一系列方法调用开始的。onCreate()是这些电话中的第一个。

您的每项活动android.app.Activity都可以直接扩展,也可以通过将的另一个子类继承而扩展Activity

在Java中,当您从类继承时,可以覆盖其方法以在其中运行您自己的代码。一个很常见的例子是toString()扩展时方法的重写java.lang.Object

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

但是,您必须在方法中包含此超级调用,因为如果不这样做,则其中的onCreate()代码Activity将永远不会运行,并且您的应用程序将遇到各种问题,例如没有将Context分配给Activity(尽管您会点击一个,SuperNotCalledException然后才有机会弄清楚自己没有上下文)。

简而言之,Android自己的类非常复杂。框架类中的代码处理诸如UI绘制,房屋清洁以及维护Activity和应用程序生命周期之类的事情。super调用使开发人员可以在后台运行此复杂代码,同时仍为我们自己的应用程序提供良好的抽象水平。


2
另一个问题-当我们重写父类方法时,此派生方法是否仍保留父类方法的代码,还是一个新的新鲜方法?
Pramod

15
如果调用超级,则将父方法的代码放在超级调用所在的位置。如果未调用super,则它是新方法。
Raghav Sood

2
拉加夫·苏德(Raghav Sood),我认为您应该在答案中添加注释文本,因为它对初学者更容易理解超级方法的用法。至少我仅从您的评论中了解它:)
Ayaz Alifov 2014年

5

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

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

Android类的工作方式相同。通过扩展Activity具有onCreate(Bundle bundle)编写有意义代码的方法的类并在定义的活动中执行该代码,可以将super关键字与onCreate()方法一起使用super.onCreate(bundle)

这是用Activity类onCreate()方法编写的代码,Android开发团队稍后可能会向该方法添加一些更有意义的代码。因此,为了反映添加的内容,应该在您的类中调用super.onCreate()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.
 */

它还维护着变量mCalled,这意味着您已经super.onCreate(savedBundleInstance)在Activity中调用了。

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

因为在super.onCreate()上它将到达Activity(任何活动的父类)类以加载savedInstanceState,并且我们通常不设置任何已保存的实例状态,但是android框架做了这样一种方式,我们应该调用那。


您的代码将愉快地编译,即使你不打电话super.onCreate(savedInstanceState),除非你有它的一些其他错误
拉夫·索德

1

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.