96

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

初心者として、上記の行の目的を説明できる人はいますか?

4

4 に答える 4

170

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

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

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

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

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

要するに、Android 独自のクラスは信じられないほど複雑になる可能性があります。フレームワーク クラスのコードは、UI の描画、ハウス クリーニング、Activity とアプリケーションのライフサイクルの維持などを処理します。super呼び出しを使用すると、開発者はこの複雑なコードを舞台裏で実行できますが、独自のアプリに適切なレベルの抽象化を提供できます。

于 2013-02-03T11:30:28.870 に答える
5

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

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

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

これはアクティビティ クラス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)

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 (任意のアクティビティの親クラス) クラスに到達して、savedInstanceState をロードするため、通常は保存されたインスタンスの状態を設定しませんが、Android フレームワークはそのように作成されているため、呼び出す必要がありますそれ。

于 2013-02-03T11:33:02.967 に答える
1

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

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

于 2015-07-15T17:32:12.487 に答える