나는 안드로이드 응용 프로그램 프로젝트를 생성하고 MainActivity.java에서> onCreate()
가 호출됩니다 super.onCreate(savedInstanceState)
.
초심자라면 누구든지 위 줄의 목적을 설명 할 수 있습니까?
답변:
모든 활동은 일련의 메서드 호출을 통해 시작됩니다. onCreate()
이 호출 중 첫 번째입니다.
각각의 활동은 android.app.Activity
직접적으로 또는의 다른 하위 클래스를 하위 클래스로 확장 하여 확장 됩니다 Activity
.
Java에서는 클래스에서 상속 할 때 해당 메서드를 재정 의하여 자체 코드를 실행할 수 있습니다. 이것의 매우 일반적인 예는 toString()
확장 할 때 메서드를 재정의하는 것입니다 java.lang.Object
.
메서드를 재정의 할 때 클래스의 메서드를 완전히 대체하거나 기존 부모 클래스의 메서드를 확장 할 수 있습니다. 를 호출 super.onCreate(savedInstanceState);
하여 Dalvik VM에 부모 클래스의 onCreate ()에있는 기존 코드 외에 코드를 실행 하도록 지시합니다. 이 줄을 생략하면 코드 만 실행됩니다. 기존 코드는 완전히 무시됩니다.
그러나이 슈퍼 호출을 메서드에 포함해야합니다. 그렇지 않으면 onCreate()
코드 Activity
가 실행되지 않고 앱이 활동에 컨텍스트가 할당되지 않는 것과 같은 모든 종류의 문제가 발생하기 때문입니다. a SuperNotCalledException
) 컨텍스트가 없다는 것을 파악하기 전에).
간단히 말해서, 안드로이드 자체 클래스는 엄청나게 복잡 할 수 있습니다. 프레임 워크 클래스의 코드는 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()");
}
}
여기에서 소스 코드를 참조하십시오.