【问题标题】:super.onCreate(savedInstanceState);super.onCreate(savedInstanceState);
【发布时间】:2013-01-18 06:38:03
【问题描述】:

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

作为初学者,谁能解释一下上面这行的目的是什么?

【问题讨论】:

    标签: android instance super oncreate


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

    • 还有一个问题——当我们重写父类方法时,这个派生方法是否还保留着父类方法的代码,还是一个新的方法?
    • 如果调用super,父方法的代码放在super调用的地方。如果 super 没有被调用,它是一个新的方法。
    • Raghav Sood,我认为您应该将您的评论文本添加到答案中,因为它对初学者来说更容易理解 super 方法的用法。至少我只是从你的评论中理解的:)
    • 这非常详细,非常有帮助。在 2021 年,我觉得它仍然很有帮助。
    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 即使你不调用super.onCreate(savedInstanceState),你的代码也会顺利编译,除非你有其他错误
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 1970-01-01
        • 2018-03-06
        • 2011-08-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多