web-dev-qa-db-ja.com

super.onCreate(savedInstanceState);

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

初心者として、上記の行の目的は何ですか?

80
Pramod

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

アクティビティはすべて、Android.app.Activityを直接拡張するか、Activityの別のサブクラスをサブクラス化することにより拡張します。

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

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

ただし、メソッドにこのスーパーコールを含める必要があります。そうしないと、ActivityonCreate()コードが実行されず、アプリがコンテキストを持たないなどのあらゆる問題に遭遇するためです。アクティビティに割り当てられます(ただし、コンテキストがないことがわかる前にSuperNotCalledExceptionにヒットします)。

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

146
Raghav Sood

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

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

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

これは、アクティビティクラス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も保持します。これは、アクティビティで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

4
Ajay S

Super.onCreate()で、Activity(任意のアクティビティの親クラス)クラスに到達してsavedInstanceStateをロードするため、通常、保存されたインスタンスの状態は設定しませんが、Androidフレームワークはそのように作成しますそれ、私たちはそれを呼ぶべきです。

1
Govil

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

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

1
M_ Fa