私は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
が実行されず、アクティビティにコンテキストが割り当てられていないなど、あらゆる種類の問題がアプリで発生します(ただし、 a SuperNotCalledException
コンテキストがないことを理解する前に)。
つまり、Android独自のクラスは非常に複雑になる可能性があります。フレームワーククラスのコードは、UI描画、ハウスクリーニング、アクティビティとアプリケーションのライフサイクルの維持などを処理します。super
呼び出しにより、開発者はこの複雑なコードをバックグラウンドで実行できると同時に、独自のアプリに優れた抽象化レベルを提供できます。
*派生クラス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()");
}
}
ここでソースコードを参照してください。
super.onCreate()で、それはActivity(任意のアクティビティの親クラス)クラスに到達して、saveedInstanceStateをロードし、通常、保存されたインスタンスの状態を設定しませんが、Androidフレームワークは、それ。
super.onCreate(savedInstanceState)
他のエラーがなければ、コードはを呼び出さなくても問題なくコンパイルされます