super.onCreate(savedInstanceState);


88

私はAndroidアプリケーションプロジェクトを作成し、MainActivity.javaでonCreate()それを呼び出していsuper.onCreate(savedInstanceState)ます。

初心者として、誰でも上記の行の目的を説明できますか?

回答:


159

作成するすべてのアクティビティは、一連のメソッド呼び出しによって開始されます。onCreate()これらの呼び出しの最初のものです。

すべてのアクティビティはandroid.app.Activity、直接またはの別のサブクラスをサブクラス化することによって拡張されますActivity

Javaでは、クラスから継承するときに、そのメソッドをオーバーライドして、クラス内で独自のコードを実行できます。この非常に一般的な例は、toString()拡張時のメソッドのオーバーライドですjava.lang.Object

メソッドをオーバーライドする場合、クラスのメソッドを完全に置き換えるか、既存の親クラスのメソッドを拡張するかを選択できます。を呼び出すことにより、親クラスのonCreate()にある既存のコードに加えて、super.onCreate(savedInstanceState);コードを実行するようにDalvik VMに指示します。この行を省略すると、コードのみが実行されます。既存のコードは完全に無視されます。

ただし、このスーパーコールをメソッドに含める必要があります。そうしないと、onCreate()コードActivityが実行されず、アクティビティにコンテキストが割り当てられていないなど、あらゆる種類の問題がアプリで発生します(ただし、 a SuperNotCalledExceptionコンテキストがないことを理解する前に)。

つまり、Android独自のクラスは非常に複雑になる可能性があります。フレームワーククラスのコードは、UI描画、ハウスクリーニング、アクティビティとアプリケーションのライフサイクルの維持などを処理します。super呼び出しにより、開発者はこの複雑なコードをバックグラウンドで実行できると同時に、独自のアプリに優れた抽象化レベルを提供できます。


2
もう1つの質問-親クラスのメソッドをオーバーライドしても、この派生メソッドはまだ親クラスのメソッドのコードを保持していますか、それとも新しい新しいメソッドですか?
Pramod 2013

15
superを呼び出す場合、親メソッドのコードは、super呼び出しがある場所に配置されます。superが呼び出されない場合は、新鮮なメソッドです。
Raghav Sood 2013

2
Raghav Sood、初心者にとってスーパーメソッドの使用法をよりわかりやすく説明しているので、コメントテキストを回答に追加する必要があると思います。少なくとも私はあなたのコメントからのみそれを理解しました:)
Ayaz Alifov '26

5

*派生クラスonCreate(bundle)メソッドは、このメソッドのスーパークラス実装を呼び出す必要があります。「super」キーワードが使用されていない場合、例外SuperNotCalledExceptionがスローされます。

での継承でJava、スーパークラスメソッドをオーバーライドし、上記のクラスメソッドを実行するにsuper.methodname()は、オーバーライドする派生クラスメソッドで使用します。

Androidクラスも同じように機能します。意味のあるコードが記述されたメソッドActivityを持つクラスを拡張onCreate(Bundle bundle)し、定義されたアクティビティでそのコードを実行するには、メソッドonCreate()でsuperキーワードを使用しsuper.onCreate(bundle)ます。

これはActivityクラスonCreate()メソッドで記述されたコードであり、Android Devチームは後でこのメソッドにさらに意味のあるコードを追加する可能性があります。そのため、追加を反映するために、クラスで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)します。

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(任意のアクティビティの親クラス)クラスに到達して、saveedInstanceStateをロードし、通常、保存されたインスタンスの状態を設定しませんが、Androidフレームワークは、それ。


super.onCreate(savedInstanceState)他のエラーがなければ、コードはを呼び出さなくても問題なくコンパイルされます
Raghav Sood

1

何らかの暗黙的な理由(たとえば、ユーザーが[戻る]ボタンを押したためではない)のためにアクティビティが破棄されて再開された場合に、onCreate()を介してアプリケーションに返したい情報です。onSaveInstanceState()の最も一般的な用途は、画面の回転を処理することです。デフォルトでは、ユーザーがG1キーボードをスライドするとアクティビティが破棄され、再作成されます。

super.onCreate(savedInstanceState)を呼び出す理由は、コードがコンパイルされないためです。;-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.