Android アプリケーション プロジェクトを作成し、MainActivity.java で >onCreate()
を呼び出していsuper.onCreate(savedInstanceState)
ます。
初心者として、上記の行の目的を説明できる人はいますか?
作成するすべてのアクティビティは、一連のメソッド呼び出しによって開始されます。onCreate()
これらの呼び出しの最初のものです。
アクティビティはすべてandroid.app.Activity
、直接、または の別のサブクラスをサブクラス化することによって拡張されますActivity
。
Java では、クラスから継承するときに、そのメソッドをオーバーライドして独自のコードを実行できます。これの非常に一般的な例は、toString()
拡張時のメソッドのオーバーライドですjava.lang.Object
。
メソッドをオーバーライドする場合、クラス内のメソッドを完全に置き換えるか、既存の親クラスのメソッドを拡張するかを選択できます。を呼び出すことにより、親クラスの onCreate() 内の既存のコードに加えsuper.onCreate(savedInstanceState);
て、Dalvik VM にコードを実行するように指示します。この行を省略すると、コードのみが実行されます。既存のコードは完全に無視されます。
ただし、メソッドにこのスーパー コールを含める必要があります。そうしないと、onCreate()
コードActivity
が実行されず、アクティビティにコンテキストが割り当てられないなど、アプリであらゆる種類の問題が発生するためです (ただし、SuperNotCalledException
コンテキストがないことを理解する機会が得られる前に)。
要するに、Android 独自のクラスは信じられないほど複雑になる可能性があります。フレームワーク クラスのコードは、UI の描画、ハウス クリーニング、Activity とアプリケーションのライフサイクルの維持などを処理します。super
呼び出しを使用すると、開発者はこの複雑なコードを舞台裏で実行できますが、独自のアプリに適切なレベルの抽象化を提供できます。
*派生クラス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()");
}
}
ソースコードはこちらをご覧ください。
super.onCreate() が発生すると、Activity (任意のアクティビティの親クラス) クラスに到達して、savedInstanceState をロードするため、通常は保存されたインスタンスの状態を設定しませんが、Android フレームワークはそのように作成されているため、呼び出す必要がありますそれ。
これは、何らかの暗黙の理由 (たとえば、ユーザーが [戻る] ボタンを押したからではない) によってアクティビティが破棄され、再開された場合に、onCreate() を介してアプリケーションに返される情報です。onSaveInstanceState() の最も一般的な用途は、画面の回転を処理することです。デフォルトでは、ユーザーが G1 キーボードをスライドするとアクティビティが破棄され、再作成されます。
super.onCreate(savedInstanceState) を呼び出す理由は、そうしないとコードがコンパイルされないためです。;-)