96

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

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

4

4 回答 4

170

您所做的每个活动都是通过一系列方法调用启动的。onCreate()是这些电话中的第一个。

您的每一个活动android.app.Activity都直接扩展或通过继承Activity.

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

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

但是,您必须在您的方法中包含这个超级调用,因为如果您不这样做,那么其中的onCreate()代码Activity将永远不会运行,并且您的应用程序将遇到各种问题,例如没有为 Activity 分配上下文(尽管您会遇到aSuperNotCalledException在你有机会弄清楚你没有上下文之前)。

简而言之,Android 自己的类可能非常复杂。框架类中的代码处理 UI 绘制、房屋清洁以及维护 Activity 和应用程序生命周期等内容。super调用允许开发人员在幕后运行这个复杂的代码,同时仍然为我们自己的应用程序提供良好的抽象级别。

于 2013-02-03T11:30:28.870 回答
5

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

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

Android 类的工作方式相同。通过扩展具有编写有意义代码的方法的Activity类并在定义的活动中执行该代码,请使用 super 关键字和 onCreate() 等方法。onCreate(Bundle bundle)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

于 2013-02-03T11:29:14.133 回答
1

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

于 2013-02-03T11:33:02.967 回答
1

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

调用 super.onCreate(savedInstanceState) 的原因是因为您的代码不会编译。;-)

于 2015-07-15T17:32:12.487 回答