나는 안드로이드 응용 프로그램 프로젝트를 생성하고 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()");
}
}
여기에서 소스 코드를 참조하십시오.