super.onCreate(savedInstanceState);

时间:2013-02-03 11:19:52

标签: android instance super oncreate

我已经在MainActivity.java中创建了一个Android应用程序项目> onCreate()正在调用super.onCreate(savedInstanceState)

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

4 个答案:

答案 0 :(得分:146)

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

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

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

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

但是,您必须在方法中包含此超级调用,因为如果不这样做,则onCreate()中的Activity代码永远不会运行,并且您的应用会遇到各种各样的问题,例如没有为活动分配上下文(尽管在你有机会发现你没有上下文之前你会点击SuperNotCalledException。)

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

答案 1 :(得分:4)

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

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

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

这是用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,这意味着您已在活动中调用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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

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