super.onCreate (savedInstanceState);


88

나는 안드로이드 응용 프로그램 프로젝트를 생성하고 MainActivity.java에서> onCreate()가 호출됩니다 super.onCreate(savedInstanceState).

초심자라면 누구든지 위 줄의 목적을 설명 할 수 있습니까?

답변:


159

모든 활동은 일련의 메서드 호출을 통해 시작됩니다. onCreate()이 호출 중 첫 번째입니다.

각각의 활동은 android.app.Activity직접적으로 또는의 다른 하위 클래스를 하위 클래스로 확장 하여 확장 됩니다 Activity.

Java에서는 클래스에서 상속 할 때 해당 메서드를 재정 의하여 자체 코드를 실행할 수 있습니다. 이것의 매우 일반적인 예는 toString()확장 할 때 메서드를 재정의하는 것입니다 java.lang.Object.

메서드를 재정의 할 때 클래스의 메서드를 완전히 대체하거나 기존 부모 클래스의 메서드를 확장 할 수 있습니다. 를 호출 super.onCreate(savedInstanceState);하여 Dalvik VM에 부모 클래스의 onCreate ()에있는 기존 코드 외에 코드를 실행 하도록 지시합니다. 이 줄을 생략하면 코드 만 실행됩니다. 기존 코드는 완전히 무시됩니다.

그러나이 슈퍼 호출을 메서드에 포함해야합니다. 그렇지 않으면 onCreate()코드 Activity가 실행되지 않고 앱이 활동에 컨텍스트가 할당되지 않는 것과 같은 모든 종류의 문제가 발생하기 때문입니다. a SuperNotCalledException) 컨텍스트가 없다는 것을 파악하기 전에).

간단히 말해서, 안드로이드 자체 클래스는 엄청나게 복잡 할 수 있습니다. 프레임 워크 클래스의 코드는 UI 그리기, 집 청소, 활동 및 애플리케이션 수명주기 유지와 같은 작업을 처리합니다. super호출을 통해 개발자는이 복잡한 코드를 백그라운드에서 실행할 수 있으며 여전히 자체 앱에 대해 좋은 수준의 추상화를 제공 할 수 있습니다.


2
한 가지 더 질문-부모 클래스 메서드를 재정의 할 때이 파생 메서드가 여전히 부모 클래스 메서드의 코드를 보유합니까, 아니면 새로운 새 메서드입니까?
Pramod 2013

15
super를 호출하면 상위 메서드의 코드가 super 호출이있는 곳에 배치됩니다. super가 호출되지 않으면 새로운 메서드입니다.
Raghav Sood 2013

2
Raghav Sood, 나는 초심자에게 더 이해하기 쉬운 방법의 사용법을 설명하기 때문에 당신의 코멘트 텍스트를 대답에 추가해야한다고 생각합니다. 적어도 난 단지 : 귀하의 코멘트에서 이해
AYAZ Alifov에게

5

* 파생 클래스 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()");
    }
}

여기에서 소스 코드를 참조하십시오.

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


1

super.onCreate ()에서 이는 savedInstanceState를로드하기 위해 Activity (모든 활동의 부모 클래스) 클래스에 도달하고, 일반적으로 저장된 인스턴스 상태를 설정하지 않기 때문에 Android 프레임 워크는 이러한 방식으로 만들었으므로 다음을 호출해야합니다. 그.


당신이 전화를하지 않더라도 코드는 행복하게 컴파일 super.onCreate(savedInstanceState)당신이 몇 가지 다른 오류가 없다면,
래 가브 수드

1

암시적인 이유 (예 : 사용자가 뒤로 버튼을 눌렀 기 때문이 아님)로 인해 액티비티가 파괴되고 다시 시작되는 경우 onCreate ()를 통해 애플리케이션에 반환하려는 정보입니다. onSaveInstanceState ()의 가장 일반적인 용도는 화면 회전을 처리하는 것입니다. 기본적으로 사용자가 G1 키보드를 밀어 낼 때 활동이 파괴되고 다시 생성되기 때문입니다.

super.onCreate (savedInstanceState)를 호출하는 이유는 코드가 그렇지 않으면 컴파일되지 않기 때문입니다. ;-)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.